From 43fbcecbaf08b346bf1f9c57226b4a91bd98279a Mon Sep 17 00:00:00 2001 From: Andrew Fitzgibbon Date: Thu, 21 Aug 2025 15:50:57 +0100 Subject: [PATCH 1/4] reorder fields for better docs --- docs/source/01-decode.ipynb | 2 +- docs/source/index.rst | 5 +++-- src/gfloat/types.py | 24 ++++++++++++------------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/source/01-decode.ipynb b/docs/source/01-decode.ipynb index 1683b9f..bbbc7e4 100644 --- a/docs/source/01-decode.ipynb +++ b/docs/source/01-decode.ipynb @@ -45,7 +45,7 @@ { "data": { "text/plain": [ - "FormatInfo(name='ocp_e5m2', k=8, precision=3, bias=15, has_nz=True, domain=, num_high_nans=3, has_subnormals=True, is_signed=True, is_twos_complement=False)" + "FormatInfo(name='ocp_e5m2', k=8, precision=3, bias=15, is_signed=True, domain=, has_nz=True, num_high_nans=3, has_subnormals=True, is_twos_complement=False)" ] }, "execution_count": 2, diff --git a/docs/source/index.rst b/docs/source/index.rst index de2eb28..0477468 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -66,7 +66,7 @@ As well as block formats from |ocp_mx_link|. .. |p3109_link| raw:: html - + IEEE P3109 @@ -88,7 +88,8 @@ For fast implementations of these datatypes see, for example, `ml_dtypes `_, `bitstring `_, `MX PyTorch Emulation Library `_, -`APyTypes `_. +`APyTypes `_, +`TorchAO `_. To get started with the library, we recommend perusing the notebooks, otherwise you may wish to jump straight into the API. diff --git a/src/gfloat/types.py b/src/gfloat/types.py index 6b7d780..3961f9c 100644 --- a/src/gfloat/types.py +++ b/src/gfloat/types.py @@ -97,24 +97,24 @@ class FormatInfo: #: Exponent bias bias: int - #: Set if format encodes -0 at (sgn=1,exp=0,significand=0). - #: If False, that encoding decodes to a NaN labelled NaN_0 - has_nz: bool + #: Signedness: True if the format encodes negative numbers + is_signed: bool - #: Set if format includes +/- Infinity. - #: If set, the non-nan value with the highest encoding for each sign (s) + #: Domain: Finite or Extended + #: If Extended, the non-nan value with the highest encoding for each sign (s) #: is replaced by (s)Inf. domain: Domain + #: Set if format encodes -0 at (sgn=1,exp=0,significand=0). + #: If False, that encoding decodes to a NaN labelled NaN_0 + has_nz: bool + #: Number of NaNs that are encoded in the highest encodings for each sign num_high_nans: int #: Set if format encodes subnormals has_subnormals: bool - #: Set if the format has a sign bit - is_signed: bool - #: Set if the format uses two's complement encoding for the significand is_twos_complement: bool @@ -125,22 +125,22 @@ def __init__( precision: int, *, bias: int, - has_nz: bool, + is_signed: bool, domain: Domain, + has_nz: bool, num_high_nans: int, has_subnormals: bool, - is_signed: bool, is_twos_complement: bool, ): self.name = name self.k = k self.precision = precision self.bias = bias - self.has_nz = has_nz + self.is_signed = is_signed self.domain = domain + self.has_nz = has_nz self.num_high_nans = num_high_nans self.has_subnormals = has_subnormals - self.is_signed = is_signed self.is_twos_complement = is_twos_complement #: ## Derived values From 4a5b0432d8bc393e95481dea3e38c94ac70a9488 Mon Sep 17 00:00:00 2001 From: Andrew Fitzgibbon Date: Thu, 21 Aug 2025 17:10:17 +0100 Subject: [PATCH 2/4] Add Signedness enum. Bump version --- ChangeLog | 12 +- docs/source/01-decode.ipynb | 6 +- docs/source/02-value-stats.ipynb | 186 +++++++++++++++--------------- docs/source/03-value-tables.ipynb | 146 +++++++++++------------ docs/source/conf.py | 4 +- etc/package.sh | 4 +- pyproject.toml | 2 +- src/gfloat/formats.py | 40 +++---- src/gfloat/types.py | 9 ++ test/test_decode.py | 6 +- test/test_p3109_spec.py | 11 +- 11 files changed, 222 insertions(+), 204 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6555896..7779536 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,11 +1,21 @@ +0.5: August 21, 2025 + - Use array-api for cross-framework compatibility + - Fix rounding issue for large bfloat16s by @blissb-positron in #49 + - Replaced microxscaling with torchao + - Update IEEE P3109 implementation to Interim Report v3 + +0.4: Nov 13, 2024 + - Add stochastic rounding + - Add vectorized versions of round/encode/decode for near-JAX speed + - Update IEEE P3109 implementation to Interim report v2 + 0.3: Jun 10, 2024 - Use python ints throughout, adding float64 to test - Simplify round, fix directed rounding - Rename "ival" to "code" in FloatValue - Shorten format names from "format_info_*" to "*" - 0.2: May 21, 2024 - Add MX Formats - Improved CI diff --git a/docs/source/01-decode.ipynb b/docs/source/01-decode.ipynb index bbbc7e4..849cb1f 100644 --- a/docs/source/01-decode.ipynb +++ b/docs/source/01-decode.ipynb @@ -287,7 +287,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+EAAAH5CAYAAADuoz85AAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAAnutJREFUeJzs3XlclOXaB/DfzDAzDPuwg4C4K2agAkKWYW5pWLSAW4rLqx1Fq8ORzE6aS2ZauSWlpQhppZ1Kj1HaMcncRS1MM80djEVRFtlmYGbeP4jRkSXQmWdg+H0/n3l553meee77QTx5cV/3dYl0Op0ORERERERERGRyYnNPgIiIiIiIiKi1YBBOREREREREJBAG4UREREREREQCYRBOREREREREJBAG4UREREREREQCYRBOREREREREJBAG4UREREREREQCsTL3BIxNq9UiOzsb9vb2EIlE5p4OERERERERWTidTodbt27B29sbYnHDa90WF4RnZ2fD19fX3NMgIiIiIiKiViYrKws+Pj4NXmMxQXhiYiISExNRVVUFoPrhHRwczDwrIiIiIiIisnTFxcXw9fWFvb39314r0ul0OgHmJJji4mI4OjqiqKiIQTgRERERERGZXFPiUIspzJaYmIiAgACEhISYeypEREREREREdeJKOBEREREREdF9aJUr4URERERERETNncUVZtNoNI26XqPRoLKy0sSzIrp/UqkUEonE3NMgIiIiIiIjaHXp6DqdDrm5uSgsLBR+ckT3yMnJCZ6enhCJROaeChERERER3aUp6egWsxLeWDUBuLu7O2xsbBjUULOm0+lQVlaGa9euAQC8vLzMPCMiIiIiIrofFhOENyYdXaPR6ANwFxcXAWdHdO8UCgUA4Nq1a3B3d2dqOhERERFRC2Yxhdni4uJw+vRpHD16tN5ravaA29jYCDUtIqOo+ZllHQMiIiIiopbNYoLwpmAKOrU0/JklIiIiIrIMrTIIJyIiIiIiIjIHiwnCExMTERAQgJCQEHNPhYiIiIiIiKhOFhOEN2ZPOBEREREREZE5WUwQLrRL+aVYsvMMZnz+C5bsPINL+aXmnpLZ3LhxA48//ji8vb0hl8vh6+uL6dOno7i4+L7ue/PmTcyYMQNdunSBQqGAn58fXnzxRRQVFRlp5kRERERERMKymBZlQvriWBZe/epXiEQi6HQ6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hpufvf4lRHuyzMxMxMfH4+zZs/j888/x/vvv46WXXkJpaSlee+01HD58GFeuXMHx48cxceJE/Pnnn4iOjjb4fEZGBjIzM6HRaJCRkYGMjAx9wDt48GAEBARg7NixOHHiBL7//nu8/vrriIuLg1wuB1AdEG/atAnnzp1Deno6Ro4ciVOnTulbmDWWu7s70tLScObMGYwaNUqf9j169Gi4uLhgwoQJOH36NPbu3YuEhARMnDgRCoVC/3m1Wo1Jkybh9OnT+O677/DGG29g+vTp+l8EzJ49G3v37sXly5dx8uRJzJ49G3v27MGYMWPqnVNycjLWr1+PU6dO4eLFi9i0aRMUCgXatm3bpGcjIiIiau6UciVkEsOuMjKJDEq50kwzImo9LKYwW2swbtw4lJeXIzQ0FBKJBC+99BKmTJkClUqFM2fOICUlBfn5+XBxcUFISAj27dun74kNAHPnzkVKSor+fc+ePQEAP/74IyIiIiCRSJCamoqpU6ciPDwctra2iI2NxYIFC/Sf0Wg0eO+993D27FlIpVL0798fBw8ehL+/f5Ofx9PTE2lpaYiIiMCYMWPw2Wefwc7ODrt27cKMGTMQHBwMFxcXxMTE4M033zT47IABA9CpUyf069cPKpUKo0aNwrx58/Tnr127hnHjxiEnJweOjo548MEH8f3332PQoEH1zsfJyQlvv/024uPjodFo0KNHD3zzzTdwcXFp8rMRERERNWdedl5IjUo12AOulCtZlI1IAOwT3kJEREQgKCgIK1asMPdUzO7uXuOtQUv+2SUiIiIisnTsE05ERERERETUDFlMEC70nnCqm52dXb2vffv2mXt6REREREREZsU94S3Enj17zD2FRsnIyKj3XJs2bYwyRnJyslHuQ0REREREJDQG4WRUHTt2NPcUiIiIiIiImi2LSUcnIiIiIiIiau4YhBMREREREREJxGLS0RMTE5GYmAiNRmPuqRARERERNVlOSQ77dhO1AhYThMfFxSEuLk7fn42IiIiIqKXIKclB5LZIqDVq/TGZRIbUqFQG4kQWhunoRERERERmVqAqMAjAAUCtURusjBORZWAQToIaP348oqKizD0NAEBubi4GDRoEW1tbODk5mXs6RERERETUCjAItxDz5s1D165dYWtrC6VSiYEDB+LIkSMG1yxatAgPPfQQbGxs6g06MzMz8cQT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IQHOzs7w8fHBhg0bDOY7a9YsdO7cGTY2Nmjfvj3mzJmDysrKRn3vtFotfHx88OGHHxoc/+WXXyAWi3HlyhUAwLJly9CjRw/Y2trC19cX06ZNQ0lJSb33rXmWO7388suIiIgwGHvx4sVo164dFAoFAgMD8eWXX+rPFxQUYMyYMXBzc4NCoUCnTp1qPTsREVFz5GXnhdSoVGyJ3KJ/sShby1OZnY3y337Tvyqzs002Vk3fbv+vvtS/WJStZREyPfxqQTl0dQTgAKDT6XC1oNzoYwrJYlbChZSZmYlu3bqhrKxMf8zGxga///47/Pz8jD6enZ0d7OzssG3bNoSFhUEul9/X/RISErBy5Up4enritddew/Dhw/HHH3/oV6rLysrw7rvvYuPGjRCLxXj++ecxc+ZMfPrppwCAlStX4r333sPatWvRs2dPJCUl4cknn8Rvv/2GTp066cd59dVX8d5776Fnz56wtrbGnj17kJaWBh8fH+zduxcHDhzApEmTcPDgQfTr1w9HjhzBli1b8MILL2DQoEHw8fEBANjb2yM5ORne3t44efIkJk+eDHt7e7zyyit/+6xisRijRo3CZ599hqlTp+qPf/rpp+jbty/atm2rv27VqlVo164dLl68iGnTpuGVV17BBx98cM/f58WLF2PTpk1Ys2YNOnXqhL179+L555+Hm5sbHn30UcyZMwenT5/Gjh074OrqivPnz6O8vGX/DwoREbUeXnZeDLpbMHNUK2ff7pbrzvRw/er0X19nffUrQvyd4W/EFXEfpaLBlXAfpcJoY5mDxayECyk/Px9lZWXYtGkTjh8/jk2bNqGsrAz5+fkmGc/KygrJyclISUmBk5MT+vbti9deew2//vrrPd3vjTfewKBBg9CjRw+kpKQgLy8PW7du1Z+vrKzEmjVrEBwcjF69emH69OnYvXu3/vy7776LWbNmYeTIkejSpQuWLFmCoKAgrFixwmCcl19+Gc888wzatWsHL6/q/0g7Oztj1apV6NKlCyZOnIguXbqgrKwMr732Gjp16oTZs2dDJpNh//79+vu8/vrreOihh+Dv74/hw4dj5syZ+OKLLxr9vGPGjMGBAwf02QparRabN2/GmDFjDObav39/+Pv747HHHsObb77ZpDHuplKp8NZbbyEpKQlDhgxB+/btMX78eDz//PNYu3YtgOpf5vTs2RPB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", + "image/png": "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6IhFixahqqoKcXFxcHJygre3Nz777DO9+c6ZMwddunSBtbU1OnTogHnz5qGysrJR3zuNRgNvb298/PHHesd/+eUXiMViXL16FQCwYsUK9OzZEzY2NvDx8cGMGTNQUlJS731rnuVur7zyCsLCwvTGXrp0Kdq3bw+5XA5/f398/fXXuvMFBQUYN24cXF1dIZfL0blz51rPTkRE1Bx52noiJSIFW8O36l4sytbyVGZno/y333Svyuxso41V07fb95uvdS8WZWtZhEwPv1ZQDm0dATgAaLVaXCsoN/iYQjKblXAhZWZmonv37igrK9Mds7a2xu+//462bdsafDxbW1vY2tpi+/btCAkJgaWl5QPdLy4uDh988AE8PDzw+uuvY+TIkfjjjz90K9VlZWV47733sHHjRojFYrzwwguYPXs2Nm/eDAD44IMP8P7772PdunXo1asXEhIS8NRTT+G3335D586ddeO89tpreP/999GrVy9YWVkhLS0Nqamp8Pb2xr59+3Dw4EFMmTIFhw4dwoABA3D06FFs3boVL774IoYMGQJvb28AgJ2dHRITE+Hl5YVTp05h6tSpsLOzw6uvvvq3zyoWizFmzBh88cUXmD59uu745s2b0b9/f7Rr1073udWrV6N9+/a4dOkSZsyYgVdffRUfffTRfX+fly5dik2bNmHt2rXo3Lkz9u3bhxdeeAGurq547LHHMG/ePJw5cwY7d+6Ei4sLLly4gPLylv0/KERE1Hp42noy6G7BTFGtnH27W66708N1q9N/fZ3zza8I8nWCrwFXxL0V8gZXwr0VcoONZQpmsxIupPz8fJSVlWHTpk04ceIENm3ahLKyMuTn5xtlPAsLCyQmJiIpKQmOjo7o378/Xn/9dfz666/3db8333wTQ4YMQc+ePZGUlIS8vDwkJyfrzldWVmLt2rUIDAxE7969MXPmTOzZs0d3/r333sOcOXMwevRodO3aFcuWLUNAQABWrVqlN84rr7yCZ599Fu3bt4enZ/V/pJ2cnLB69Wp07doVkydPRteuXVFWVobXX38dnTt3xty5cyGTyXDgwAHdfd544w3069cPvr6+GDlyJGbPno2vvvqq0c87btw4HDx4UJetoNFosGXLFowbN05vrgMHDoSvry8ef/xxvPXWW00a415KpRJvv/02EhISMGzYMHTo0AETJ07ECy+8gHXr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", "text/plain": [ "
" ] @@ -305,7 +305,7 @@ "for fi in (\n", " format_info_ocp_e3m2,\n", " format_info_ocp_e2m3,\n", - " *(format_info_p3109(6, p, Domain.Finite) for p in range(1, 6)),\n", + " *(format_info_p3109(6, p, Signedness.Signed, Domain.Finite) for p in range(1, 6)),\n", "):\n", " val = decode_ndarray(fi, code)\n", " valid = (val > 0) & np.isfinite(val)\n", @@ -352,7 +352,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Format ocp_e4m3 ocp_e5m2 p3109_k8p3es\n", + "Format ocp_e4m3 ocp_e5m2 p3109_k8p3se\n", "Exponent bias 7 15 16\n", "Infinities 0 2 2\n", "Number of NaNs 2 6 1\n", diff --git a/docs/source/02-value-stats.ipynb b/docs/source/02-value-stats.ipynb index 73030b6..f281cac 100644 --- a/docs/source/02-value-stats.ipynb +++ b/docs/source/02-value-stats.ipynb @@ -63,7 +63,7 @@ " 0\n", " \n", " \n", - " p3109_k4p2fs\n", + " p3109_k4p2sf\n", " 4\n", " 2\n", " 2\n", @@ -96,7 +96,7 @@ " 0\n", " \n", " \n", - " p3109_k6p3fs\n", + " p3109_k6p3sf\n", " 6\n", " 3\n", " 3\n", @@ -107,7 +107,7 @@ " 0\n", " \n", " \n", - " p3109_k6p4fs\n", + " p3109_k6p4sf\n", " 6\n", " 4\n", " 2\n", @@ -140,7 +140,7 @@ " 2\n", " \n", " \n", - " p3109_k8p1es\n", + " p3109_k8p1se\n", " 8\n", " 1\n", " 7\n", @@ -151,7 +151,7 @@ " 2\n", " \n", " \n", - " p3109_k8p1fs\n", + " p3109_k8p1sf\n", " 8\n", " 1\n", " 7\n", @@ -162,7 +162,7 @@ " 0\n", " \n", " \n", - " p3109_k8p1eu\n", + " p3109_k8p1ue\n", " 8\n", " 1\n", " 8\n", @@ -173,7 +173,7 @@ " 1\n", " \n", " \n", - " p3109_k8p1fu\n", + " p3109_k8p1uf\n", " 8\n", " 1\n", " 8\n", @@ -184,7 +184,7 @@ " 0\n", " \n", " \n", - " p3109_k8p3es\n", + " p3109_k8p3se\n", " 8\n", " 3\n", " 5\n", @@ -195,7 +195,7 @@ " 2\n", " \n", " \n", - " p3109_k8p3fs\n", + " p3109_k8p3sf\n", " 8\n", " 3\n", " 5\n", @@ -206,7 +206,7 @@ " 0\n", " \n", " \n", - " p3109_k8p3eu\n", + " p3109_k8p3ue\n", " 8\n", " 3\n", " 6\n", @@ -217,7 +217,7 @@ " 1\n", " \n", " \n", - " p3109_k8p3fu\n", + " p3109_k8p3uf\n", " 8\n", " 3\n", " 6\n", @@ -228,7 +228,7 @@ " 0\n", " \n", " \n", - " p3109_k8p4es\n", + " p3109_k8p4se\n", " 8\n", " 4\n", " 4\n", @@ -239,7 +239,7 @@ " 2\n", " \n", " \n", - " p3109_k8p4fs\n", + " p3109_k8p4sf\n", " 8\n", " 4\n", " 4\n", @@ -250,7 +250,7 @@ " 0\n", " \n", " \n", - " p3109_k8p4eu\n", + " p3109_k8p4ue\n", " 8\n", " 4\n", " 5\n", @@ -261,7 +261,7 @@ " 1\n", " \n", " \n", - " p3109_k8p4fu\n", + " p3109_k8p4uf\n", " 8\n", " 4\n", " 5\n", @@ -455,7 +455,7 @@ " 6\n", " \n", " \n", - " p3109_k4p2fs\n", + " p3109_k4p2sf\n", " 4\n", " 2\n", " 2\n", @@ -497,7 +497,7 @@ " 28\n", " \n", " \n", - " p3109_k6p3fs\n", + " p3109_k6p3sf\n", " 6\n", " 3\n", " 3\n", @@ -511,7 +511,7 @@ " 14\n", " \n", " \n", - " p3109_k6p4fs\n", + " p3109_k6p4sf\n", " 6\n", " 4\n", " 2\n", @@ -553,7 +553,7 @@ " 57344\n", " \n", " \n", - " p3109_k8p1es\n", + " p3109_k8p1se\n", " 8\n", " 1\n", " 7\n", @@ -567,7 +567,7 @@ " ≈4.6117e+18\n", " \n", " \n", - " p3109_k8p1fs\n", + " p3109_k8p1sf\n", " 8\n", " 1\n", " 7\n", @@ -581,7 +581,7 @@ " ≈9.2234e+18\n", " \n", " \n", - " p3109_k8p1eu\n", + " p3109_k8p1ue\n", " 8\n", " 1\n", " 8\n", @@ -595,7 +595,7 @@ " ≈4.2535e+37\n", " \n", " \n", - " p3109_k8p1fu\n", + " p3109_k8p1uf\n", " 8\n", " 1\n", " 8\n", @@ -609,7 +609,7 @@ " ≈8.5071e+37\n", " \n", " \n", - " p3109_k8p3es\n", + " p3109_k8p3se\n", " 8\n", " 3\n", " 5\n", @@ -623,7 +623,7 @@ " 49152\n", " \n", " \n", - " p3109_k8p3fs\n", + " p3109_k8p3sf\n", " 8\n", " 3\n", " 5\n", @@ -637,7 +637,7 @@ " 57344\n", " \n", " \n", - " p3109_k8p3eu\n", + " p3109_k8p3ue\n", " 8\n", " 3\n", " 6\n", @@ -651,7 +651,7 @@ " ≈2.6844e+09\n", " \n", " \n", - " p3109_k8p3fu\n", + " p3109_k8p3uf\n", " 8\n", " 3\n", " 6\n", @@ -665,7 +665,7 @@ " ≈3.2212e+09\n", " \n", " \n", - " p3109_k8p4es\n", + " p3109_k8p4se\n", " 8\n", " 4\n", " 4\n", @@ -679,7 +679,7 @@ " 224\n", " \n", " \n", - " p3109_k8p4fs\n", + " p3109_k8p4sf\n", " 8\n", " 4\n", " 4\n", @@ -693,7 +693,7 @@ " 240\n", " \n", " \n", - " p3109_k8p4eu\n", + " p3109_k8p4ue\n", " 8\n", " 4\n", " 5\n", @@ -707,7 +707,7 @@ " 53248\n", " \n", " \n", - " p3109_k8p4fu\n", + " p3109_k8p4uf\n", " 8\n", " 4\n", " 5\n", @@ -911,7 +911,7 @@ " 6\n", " \n", " \n", - " p3109_k4p2fs\n", + " p3109_k4p2sf\n", " 4\n", " 2\n", " 2\n", @@ -953,7 +953,7 @@ " 28\n", " \n", " \n", - " p3109_k6p3fs\n", + " p3109_k6p3sf\n", " 6\n", " 3\n", " 3\n", @@ -967,7 +967,7 @@ " 14\n", " \n", " \n", - " p3109_k6p4fs\n", + " p3109_k6p4sf\n", " 6\n", " 4\n", " 2\n", @@ -1009,7 +1009,7 @@ " 57344\n", " \n", " \n", - " p3109_k8p1es\n", + " p3109_k8p1se\n", " 8\n", " 1\n", " 7\n", @@ -1023,7 +1023,7 @@ " 2^62\n", " \n", " \n", - " p3109_k8p1fs\n", + " p3109_k8p1sf\n", " 8\n", " 1\n", " 7\n", @@ -1037,7 +1037,7 @@ " 2^63\n", " \n", " \n", - " p3109_k8p1eu\n", + " p3109_k8p1ue\n", " 8\n", " 1\n", " 8\n", @@ -1051,7 +1051,7 @@ " 2^125\n", " \n", " \n", - " p3109_k8p1fu\n", + " p3109_k8p1uf\n", " 8\n", " 1\n", " 8\n", @@ -1065,7 +1065,7 @@ " 2^126\n", " \n", " \n", - " p3109_k8p3es\n", + " p3109_k8p3se\n", " 8\n", " 3\n", " 5\n", @@ -1079,7 +1079,7 @@ " 49152\n", " \n", " \n", - " p3109_k8p3fs\n", + " p3109_k8p3sf\n", " 8\n", " 3\n", " 5\n", @@ -1093,7 +1093,7 @@ " 57344\n", " \n", " \n", - " p3109_k8p3eu\n", + " p3109_k8p3ue\n", " 8\n", " 3\n", " 6\n", @@ -1107,7 +1107,7 @@ " 5/4*2^31\n", " \n", " \n", - " p3109_k8p3fu\n", + " p3109_k8p3uf\n", " 8\n", " 3\n", " 6\n", @@ -1121,7 +1121,7 @@ " 3/2*2^31\n", " \n", " \n", - " p3109_k8p4es\n", + " p3109_k8p4se\n", " 8\n", " 4\n", " 4\n", @@ -1135,7 +1135,7 @@ " 224\n", " \n", " \n", - " p3109_k8p4fs\n", + " p3109_k8p4sf\n", " 8\n", " 4\n", " 4\n", @@ -1149,7 +1149,7 @@ " 240\n", " \n", " \n", - " p3109_k8p4eu\n", + " p3109_k8p4ue\n", " 8\n", " 4\n", " 5\n", @@ -1163,7 +1163,7 @@ " 53248\n", " \n", " \n", - " p3109_k8p4fu\n", + " p3109_k8p4uf\n", " 8\n", " 4\n", " 5\n", @@ -1295,11 +1295,11 @@ ], "source": [ "all_p3109 = [\n", - " format_info_p3109(k, p, domain, signedness)\n", - " for signedness in (True, False)\n", + " format_info_p3109(k, p, signedness, domain)\n", + " for signedness in (Signedness.Signed, Signedness.Unsigned)\n", " for domain in (Domain.Extended, Domain.Finite)\n", " for k in range(3, 8)\n", - " for p in range(1, k if signedness else k + 1)\n", + " for p in range(1, k if signedness == Signedness.Signed else k + 1)\n", "]\n", "\n", "stats = [compute_stats(fi) for fi in all_p3109]\n", @@ -1331,25 +1331,25 @@ "name B P E smallest smallest_normal max num_nans infs\n", "============ === === === =========== ================= ============ =========== ======\n", "ocp_e2m1 4 2 2 0.5 1 6 0 0\n", - "p3109_k4p2fs 4 2 2 0.25 0.5 3 1 0\n", + "p3109_k4p2sf 4 2 2 0.25 0.5 3 1 0\n", "ocp_e2m3 6 4 2 0.125 1 7.5 0 0\n", "ocp_e3m2 6 3 3 0.0625 0.25 28 0 0\n", - "p3109_k6p3fs 6 3 3 0.03125 0.125 14 1 0\n", - "p3109_k6p4fs 6 4 2 0.0625 0.5 3.75 1 0\n", + "p3109_k6p3sf 6 3 3 0.03125 0.125 14 1 0\n", + "p3109_k6p4sf 6 4 2 0.0625 0.5 3.75 1 0\n", "ocp_e4m3 8 4 4 ≈0.0019531 0.015625 448 2 0\n", "ocp_e5m2 8 3 5 ≈1.5259e-05 ≈6.1035e-05 57344 6 2\n", - "p3109_k8p1es 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈4.6117e+18 1 2\n", - "p3109_k8p1fs 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈9.2234e+18 1 0\n", - "p3109_k8p1eu 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈4.2535e+37 1 1\n", - "p3109_k8p1fu 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈8.5071e+37 1 0\n", - "p3109_k8p3es 8 3 5 ≈7.6294e-06 ≈3.0518e-05 49152 1 2\n", - "p3109_k8p3fs 8 3 5 ≈7.6294e-06 ≈3.0518e-05 57344 1 0\n", - "p3109_k8p3eu 8 3 6 ≈1.1642e-10 ≈4.6566e-10 ≈2.6844e+09 1 1\n", - "p3109_k8p3fu 8 3 6 ≈1.1642e-10 ≈4.6566e-10 ≈3.2212e+09 1 0\n", - "p3109_k8p4es 8 4 4 ≈0.00097656 0.0078125 224 1 2\n", - "p3109_k8p4fs 8 4 4 ≈0.00097656 0.0078125 240 1 0\n", - "p3109_k8p4eu 8 4 5 ≈3.8147e-06 ≈3.0518e-05 53248 1 1\n", - "p3109_k8p4fu 8 4 5 ≈3.8147e-06 ≈3.0518e-05 57344 1 0\n", + "p3109_k8p1se 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈4.6117e+18 1 2\n", + "p3109_k8p1sf 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈9.2234e+18 1 0\n", + "p3109_k8p1ue 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈4.2535e+37 1 1\n", + "p3109_k8p1uf 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈8.5071e+37 1 0\n", + "p3109_k8p3se 8 3 5 ≈7.6294e-06 ≈3.0518e-05 49152 1 2\n", + "p3109_k8p3sf 8 3 5 ≈7.6294e-06 ≈3.0518e-05 57344 1 0\n", + "p3109_k8p3ue 8 3 6 ≈1.1642e-10 ≈4.6566e-10 ≈2.6844e+09 1 1\n", + "p3109_k8p3uf 8 3 6 ≈1.1642e-10 ≈4.6566e-10 ≈3.2212e+09 1 0\n", + "p3109_k8p4se 8 4 4 ≈0.00097656 0.0078125 224 1 2\n", + "p3109_k8p4sf 8 4 4 ≈0.00097656 0.0078125 240 1 0\n", + "p3109_k8p4ue 8 4 5 ≈3.8147e-06 ≈3.0518e-05 53248 1 1\n", + "p3109_k8p4uf 8 4 5 ≈3.8147e-06 ≈3.0518e-05 57344 1 0\n", "binary16 16 11 5 ≈5.9605e-08 ≈6.1035e-05 65504 2046 2\n", "bfloat16 16 8 8 ≈9.1835e-41 ≈1.1755e-38 ≈3.3895e+38 254 2\n", "binary32 32 24 8 ≈1.4013e-45 ≈1.1755e-38 ≈3.4028e+38 ≈1.6777e+07 2\n", @@ -1382,25 +1382,25 @@ "name B P E smallest smallest_normal max num_nans infs\n", "============ === === === =========== ================= ======================================== ====================================== ======\n", "ocp_e2m1 4 2 2 0.5 1 6 0 0\n", - "p3109_k4p2fs 4 2 2 0.25 0.5 3 1 0\n", + "p3109_k4p2sf 4 2 2 0.25 0.5 3 1 0\n", "ocp_e2m3 6 4 2 0.125 1 7.5 0 0\n", "ocp_e3m2 6 3 3 0.0625 0.25 28 0 0\n", - "p3109_k6p3fs 6 3 3 0.03125 0.125 14 1 0\n", - "p3109_k6p4fs 6 4 2 0.0625 0.5 3.75 1 0\n", + "p3109_k6p3sf 6 3 3 0.03125 0.125 14 1 0\n", + "p3109_k6p4sf 6 4 2 0.0625 0.5 3.75 1 0\n", "ocp_e4m3 8 4 4 2^-9 0.015625 448 2 0\n", "ocp_e5m2 8 3 5 2^-16 2^-14 57344 6 2\n", - "p3109_k8p1es 8 1 7 2^-63 2^-63 2^62 1 2\n", - "p3109_k8p1fs 8 1 7 2^-63 2^-63 2^63 1 0\n", - "p3109_k8p1eu 8 1 8 2^-127 2^-127 2^125 1 1\n", - "p3109_k8p1fu 8 1 8 2^-127 2^-127 2^126 1 0\n", - "p3109_k8p3es 8 3 5 2^-17 2^-15 49152 1 2\n", - "p3109_k8p3fs 8 3 5 2^-17 2^-15 57344 1 0\n", - "p3109_k8p3eu 8 3 6 2^-33 2^-31 5/4*2^31 1 1\n", - "p3109_k8p3fu 8 3 6 2^-33 2^-31 3/2*2^31 1 0\n", - "p3109_k8p4es 8 4 4 2^-10 0.0078125 224 1 2\n", - "p3109_k8p4fs 8 4 4 2^-10 0.0078125 240 1 0\n", - "p3109_k8p4eu 8 4 5 2^-18 2^-15 53248 1 1\n", - "p3109_k8p4fu 8 4 5 2^-18 2^-15 57344 1 0\n", + "p3109_k8p1se 8 1 7 2^-63 2^-63 2^62 1 2\n", + "p3109_k8p1sf 8 1 7 2^-63 2^-63 2^63 1 0\n", + "p3109_k8p1ue 8 1 8 2^-127 2^-127 2^125 1 1\n", + "p3109_k8p1uf 8 1 8 2^-127 2^-127 2^126 1 0\n", + "p3109_k8p3se 8 3 5 2^-17 2^-15 49152 1 2\n", + "p3109_k8p3sf 8 3 5 2^-17 2^-15 57344 1 0\n", + "p3109_k8p3ue 8 3 6 2^-33 2^-31 5/4*2^31 1 1\n", + "p3109_k8p3uf 8 3 6 2^-33 2^-31 3/2*2^31 1 0\n", + "p3109_k8p4se 8 4 4 2^-10 0.0078125 224 1 2\n", + "p3109_k8p4sf 8 4 4 2^-10 0.0078125 240 1 0\n", + "p3109_k8p4ue 8 4 5 2^-18 2^-15 53248 1 1\n", + "p3109_k8p4uf 8 4 5 2^-18 2^-15 57344 1 0\n", "binary16 16 11 5 2^-24 2^-14 65504 2046 2\n", "bfloat16 16 8 8 2^-133 2^-126 255/128*2^127 254 2\n", "binary32 32 24 8 2^-149 2^-126 16777215/8388608*2^127 8388607/4194304*2^23 2\n", @@ -1430,25 +1430,25 @@ "| | name | B | P | E | smallest | smallest_normal | max | num_nans | infs |\n", "|---:|:-------------|----:|----:|----:|-------------:|------------------:|-----------------:|---------------:|-------:|\n", "| 0 | ocp_e2m1 | 4 | 2 | 2 | 0.5 | 1 | 6 | 0 | 0 |\n", - "| 1 | p3109_k4p2fs | 4 | 2 | 2 | 0.25 | 0.5 | 3 | 1 | 0 |\n", + "| 1 | p3109_k4p2sf | 4 | 2 | 2 | 0.25 | 0.5 | 3 | 1 | 0 |\n", "| 2 | ocp_e2m3 | 6 | 4 | 2 | 0.125 | 1 | 7.5 | 0 | 0 |\n", "| 3 | ocp_e3m2 | 6 | 3 | 3 | 0.0625 | 0.25 | 28 | 0 | 0 |\n", - "| 4 | p3109_k6p3fs | 6 | 3 | 3 | 0.03125 | 0.125 | 14 | 1 | 0 |\n", - "| 5 | p3109_k6p4fs | 6 | 4 | 2 | 0.0625 | 0.5 | 3.75 | 1 | 0 |\n", + "| 4 | p3109_k6p3sf | 6 | 3 | 3 | 0.03125 | 0.125 | 14 | 1 | 0 |\n", + "| 5 | p3109_k6p4sf | 6 | 4 | 2 | 0.0625 | 0.5 | 3.75 | 1 | 0 |\n", "| 6 | ocp_e4m3 | 8 | 4 | 4 | 0.00195312 | 0.015625 | 448 | 2 | 0 |\n", "| 7 | ocp_e5m2 | 8 | 3 | 5 | 1.52588e-05 | 6.10352e-05 | 57344 | 6 | 2 |\n", - "| 8 | p3109_k8p1es | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 4.61169e+18 | 1 | 2 |\n", - "| 9 | p3109_k8p1fs | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 9.22337e+18 | 1 | 0 |\n", - "| 10 | p3109_k8p1eu | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 4.25353e+37 | 1 | 1 |\n", - "| 11 | p3109_k8p1fu | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 8.50706e+37 | 1 | 0 |\n", - "| 12 | p3109_k8p3es | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 49152 | 1 | 2 |\n", - "| 13 | p3109_k8p3fs | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", - "| 14 | p3109_k8p3eu | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 2.68435e+09 | 1 | 1 |\n", - "| 15 | p3109_k8p3fu | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 3.22123e+09 | 1 | 0 |\n", - "| 16 | p3109_k8p4es | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 224 | 1 | 2 |\n", - "| 17 | p3109_k8p4fs | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 240 | 1 | 0 |\n", - "| 18 | p3109_k8p4eu | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 53248 | 1 | 1 |\n", - "| 19 | p3109_k8p4fu | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", + "| 8 | p3109_k8p1se | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 4.61169e+18 | 1 | 2 |\n", + "| 9 | p3109_k8p1sf | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 9.22337e+18 | 1 | 0 |\n", + "| 10 | p3109_k8p1ue | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 4.25353e+37 | 1 | 1 |\n", + "| 11 | p3109_k8p1uf | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 8.50706e+37 | 1 | 0 |\n", + "| 12 | p3109_k8p3se | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 49152 | 1 | 2 |\n", + "| 13 | p3109_k8p3sf | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", + "| 14 | p3109_k8p3ue | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 2.68435e+09 | 1 | 1 |\n", + "| 15 | p3109_k8p3uf | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 3.22123e+09 | 1 | 0 |\n", + "| 16 | p3109_k8p4se | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 224 | 1 | 2 |\n", + "| 17 | p3109_k8p4sf | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 240 | 1 | 0 |\n", + "| 18 | p3109_k8p4ue | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 53248 | 1 | 1 |\n", + "| 19 | p3109_k8p4uf | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", "| 20 | binary16 | 16 | 11 | 5 | 5.96046e-08 | 6.10352e-05 | 65504 | 2046 | 2 |\n", "| 21 | bfloat16 | 16 | 8 | 8 | 9.18355e-41 | 1.17549e-38 | 3.38953e+38 | 254 | 2 |\n", "| 22 | binary32 | 32 | 24 | 8 | 1.4013e-45 | 1.17549e-38 | 3.40282e+38 | 1.67772e+07 | 2 |\n", diff --git a/docs/source/03-value-tables.ipynb b/docs/source/03-value-tables.ipynb index b3b20f7..be121f7 100644 --- a/docs/source/03-value-tables.ipynb +++ b/docs/source/03-value-tables.ipynb @@ -166,7 +166,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "## p3109_k8p3es\n", + "## p3109_k8p3se\n", "0x00 = 0_00000_00 = 0.0 = 0.0\n", "0x01 = 0_00000_01 = +0b0.01*2^-15 = ~7.629e-06\n", "0x07 = 0_00001_11 = +0b1.11*2^-15 = ~5.341e-05\n", @@ -180,7 +180,7 @@ "0xe6 = 1_11001_10 = -0b1.10*2^9 = -768.0\n", "0xfe = 1_11111_10 = -0b1.10*2^15 = -49152.0\n", "0xff = 1_11111_11 = -inf = -inf\n", - "## p3109_k8p1es\n", + "## p3109_k8p1se\n", "0x00 = 0_0000000_ = 0.0 = 0.0\n", "0x01 = 0_0000001_ = +0b1.0*2^-63 = ~1.084e-19\n", "0x07 = 0_0000111_ = +0b1.0*2^-57 = ~6.939e-18\n", @@ -782,9 +782,9 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", @@ -1192,9 +1192,9 @@ "
\n", "
p3109_k4p1esp3109_k4p2esp3109_k4p3esp3109_k4p1sep3109_k4p2sep3109_k4p3seocp_e2m1
\n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k4p1esp3109_k4p2esp3109_k4p3esp3109_k4p1sep3109_k4p2sep3109_k4p3se
\n", @@ -1583,10 +1583,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k4p1esp3109_k4p1fsp3109_k4p1eup3109_k4p1fup3109_k4p1sep3109_k4p1sfp3109_k4p1uep3109_k4p1uf
\n", @@ -1993,10 +1993,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k4p2esp3109_k4p2fsp3109_k4p2eup3109_k4p2fup3109_k4p2sep3109_k4p2sfp3109_k4p2uep3109_k4p2uf
\n", @@ -2403,10 +2403,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k4p3esp3109_k4p3fsp3109_k4p3eup3109_k4p3fup3109_k4p3sep3109_k4p3sfp3109_k4p3uep3109_k4p3uf
\n", @@ -2813,10 +2813,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k4p4esp3109_k4p4fsp3109_k4p4eup3109_k4p4fup3109_k4p4sep3109_k4p4sfp3109_k4p4uep3109_k4p4uf
\n", @@ -3172,8 +3172,8 @@ "source": [ "for p in (1, 2, 3, 4):\n", " fis = [\n", - " format_info_p3109(4, p, domain, signedness == \"s\")\n", - " for signedness in (\"s\", \"u\")\n", + " format_info_p3109(4, p, signedness, domain)\n", + " for signedness in (Signedness.Signed, Signedness.Unsigned)\n", " for domain in (Domain.Extended, Domain.Finite)\n", " ]\n", " render(fis, short=False)" @@ -3248,10 +3248,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k5p1esp3109_k5p1fsp3109_k5p1eup3109_k5p1fup3109_k5p1sep3109_k5p1sfp3109_k5p1uep3109_k5p1uf
\n", @@ -3978,10 +3978,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k5p2esp3109_k5p2fsp3109_k5p2eup3109_k5p2fup3109_k5p2sep3109_k5p2sfp3109_k5p2uep3109_k5p2uf
\n", @@ -4708,10 +4708,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k5p3esp3109_k5p3fsp3109_k5p3eup3109_k5p3fup3109_k5p3sep3109_k5p3sfp3109_k5p3uep3109_k5p3uf
\n", @@ -5438,10 +5438,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k5p4esp3109_k5p4fsp3109_k5p4eup3109_k5p4fup3109_k5p4sep3109_k5p4sfp3109_k5p4uep3109_k5p4uf
\n", @@ -6168,10 +6168,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k5p5esp3109_k5p5fsp3109_k5p5eup3109_k5p5fup3109_k5p5sep3109_k5p5sfp3109_k5p5uep3109_k5p5uf
\n", @@ -6847,8 +6847,8 @@ "source": [ "for p in (1, 2, 3, 4, 5):\n", " fis = [\n", - " format_info_p3109(5, p, domain, signedness == \"s\")\n", - " for signedness in (\"s\", \"u\")\n", + " format_info_p3109(5, p, signedness, domain)\n", + " for signedness in (Signedness.Signed, Signedness.Unsigned)\n", " for domain in (Domain.Extended, Domain.Finite)\n", " ]\n", " render(fis, short=False)" @@ -6923,10 +6923,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k6p2esp3109_k6p2fsp3109_k6p2eup3109_k6p2fup3109_k6p2sep3109_k6p2sfp3109_k6p2uep3109_k6p2uf
\n", @@ -8293,10 +8293,10 @@ "
\n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
p3109_k6p3esp3109_k6p3fsp3109_k6p3eup3109_k6p3fup3109_k6p3sep3109_k6p3sfp3109_k6p3uep3109_k6p3uf
\n", @@ -9612,8 +9612,8 @@ "source": [ "for p in (2, 3):\n", " fis = [\n", - " format_info_p3109(6, p, domain, signedness == \"s\")\n", - " for signedness in (\"s\", \"u\")\n", + " format_info_p3109(6, p, signedness, domain)\n", + " for signedness in (Signedness.Signed, Signedness.Unsigned)\n", " for domain in (Domain.Extended, Domain.Finite)\n", " ]\n", " render(fis, short=False)" @@ -9663,10 +9663,10 @@ "\n", " \n", " \n", - " FP4 Value Table, p3109_k4p2es\n", + " FP4 Value Table, p3109_k4p2se\n", " \n", " \n", - "

FP4 Value Table, p3109_k4p2es

\n", + "

FP4 Value Table, p3109_k4p2se

\n", "
\n", " \n", "
\n", @@ -9789,10 +9789,10 @@ "\n", " \n", " \n", - " FP4 Value Table, p3109_k4p1es\n", + " FP4 Value Table, p3109_k4p1se\n", " \n", " \n", - "

FP4 Value Table, p3109_k4p1es

\n", + "

FP4 Value Table, p3109_k4p1se

\n", "
\n", " \n", "
\n", @@ -9915,10 +9915,10 @@ "\n", " \n", " \n", - " FP4 Value Table, p3109_k4p3es\n", + " FP4 Value Table, p3109_k4p3se\n", " \n", " \n", - "

FP4 Value Table, p3109_k4p3es

\n", + "

FP4 Value Table, p3109_k4p3se

\n", "
\n", " \n", "
\n", @@ -11936,10 +11936,10 @@ "\n", " \n", " \n", - " FP8 Value Table, p3109_k8p1fu\n", + " FP8 Value Table, p3109_k8p1uf\n", " \n", " \n", - "

FP8 Value Table, p3109_k8p1fu

\n", + "

FP8 Value Table, p3109_k8p1uf

\n", "
\n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1051,186 +1076,200 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
\n", @@ -12413,7 +12413,7 @@ " airdoc(\n", " *mktbl(\n", " Airium(),\n", - " format_info_p3109(8, 1, Domain.Finite, False),\n", + " format_info_p3109(8, 1, Signedness.Unsigned, Domain.Finite),\n", " skip_rows=range(0x10, 0x30),\n", " cols=4,\n", " width=8,\n", @@ -12467,10 +12467,10 @@ "\n", " \n", " \n", - " FP3 Value Table, p3109_k3p1fs\n", + " FP3 Value Table, p3109_k3p1sf\n", " \n", " \n", - "

FP3 Value Table, p3109_k3p1fs

\n", + "

FP3 Value Table, p3109_k3p1sf

\n", "
\n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -595,186 +606,200 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", "
\n", @@ -12518,7 +12518,7 @@ } ], "source": [ - "p3109_3p1f = format_info_p3109(3, 1, Domain.Finite)\n", + "p3109_3p1f = format_info_p3109(3, 1, Signedness.Signed, Domain.Finite)\n", "HTML(airdoc(*mktbl(Airium(), p3109_3p1f, cols=2, width=8, d=3)))" ] }, @@ -12562,10 +12562,10 @@ "\n", " \n", " \n", - " FP3 Value Table, p3109_k3p2fs\n", + " FP3 Value Table, p3109_k3p2sf\n", " \n", " \n", - "

FP3 Value Table, p3109_k3p2fs

\n", + "

FP3 Value Table, p3109_k3p2sf

\n", "
\n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -173,170 +173,181 @@ " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", + " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
\n", @@ -12613,7 +12613,7 @@ } ], "source": [ - "p3109_3p1f = format_info_p3109(3, 2, Domain.Finite)\n", + "p3109_3p1f = format_info_p3109(3, 2, Signedness.Signed, Domain.Finite)\n", "HTML(airdoc(*mktbl(Airium(), p3109_3p1f, cols=2, width=8, d=3)))" ] } diff --git a/docs/source/conf.py b/docs/source/conf.py index 290461d..2734c2b 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -7,8 +7,8 @@ project = "GFloat" copyright = "2024, Graphcore Ltd" author = "Andrew Fitzgibbon" -release = "0.4" # Set version in package.sh -version = "0.4" # Set version in package.sh +release = "0.5" # Set version in package.sh +version = "0.5" # Set version in package.sh # -- General configuration diff --git a/etc/package.sh b/etc/package.sh index c7aa471..779eeaf 100644 --- a/etc/package.sh +++ b/etc/package.sh @@ -5,7 +5,7 @@ set -o errexit # This is the master location at which to change version number -VERSION="0.4" +VERSION="0.5" # Run the script to change the version elsewhere perl -pi -e 's/^(release|version) = "([\d.]+)"/$1 = "'$VERSION'"/' docs/source/conf.py @@ -16,7 +16,7 @@ perl -pi -e 's/^version = "([\d.]+)"/version = "'$VERSION'"/' pyproject.toml # Build distribution rm -rf dist -pip install build twine +uv pip install build twine python -m build echo "Enter PyPI API Token" echo __token__ | twine upload --repository pypi dist/* --verbose diff --git a/pyproject.toml b/pyproject.toml index 0e56cfc..dfe6faa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ package-dir = {"" = "src"} [project] name = "gfloat" -version = "0.4" # Set version in package.sh +version = "0.5" # Set version in package.sh authors = [ {name = "Andrew Fitzgibbon", email = "awf@fitzgibbon.ie"}, ] diff --git a/src/gfloat/formats.py b/src/gfloat/formats.py index b559504..930fd27 100644 --- a/src/gfloat/formats.py +++ b/src/gfloat/formats.py @@ -1,7 +1,7 @@ # Copyright (c) 2024 Graphcore Ltd. All rights reserved. from .block import BlockFormatInfo -from .types import FormatInfo, Domain +from .types import FormatInfo, Domain, Signedness import math @@ -163,19 +163,17 @@ def format_info_p3109( k: int, precision: int, + signedness: Signedness = Signedness.Signed, domain: Domain = Domain.Extended, - signedness: bool = True, - may25bias: bool = False, ) -> FormatInfo: """ - FormatInfo for P3109 K{k} P{p} formats + FormatInfo for P3109 K{k} P{p} [su] [ef] formats Args: k (int): Format width in bits p (int): Precision in bits + signedness (Signedness): Signed (default) or Unsigned domain (Domain): Extended (default) or finite - signedness (bool): True (default) if signed, False if unsigned - may25bias (bool): False (default) for may25 bias Returns: FormatInfo class describing the format @@ -189,18 +187,14 @@ def format_info_p3109( if k < 2: raise ValueError(f"P3109 format not defined for k={k} < 2") - + is_signed = signedness == Signedness.Signed + sstr = "s" if is_signed else "u" estr = "e" if domain == Domain.Extended else "f" - sstr = "s" if signedness else "u" - v = "" if not may25bias else "mtfb_" - name = f"{v}p3109_k{k}p{precision}{estr}{sstr}" - if may25bias: - bias = math.floor(2 ** (k - precision - 1) - 1) + name = f"p3109_k{k}p{precision}{sstr}{estr}" + if is_signed: + bias = math.floor(2 ** (k - precision - 1)) else: - if signedness: - bias = math.floor(2 ** (k - precision - 1)) - else: - bias = 2 ** (k - precision) + bias = 2 ** (k - precision) return FormatInfo( name, @@ -209,9 +203,9 @@ def format_info_p3109( bias=bias, has_nz=False, domain=domain, - num_high_nans=0 if signedness else 1, + num_high_nans=0 if is_signed else 1, has_subnormals=True, - is_signed=signedness, + is_signed=is_signed, is_twos_complement=False, ) @@ -219,17 +213,17 @@ def format_info_p3109( # Collections of formats _tiny_formats = [ format_info_ocp_e2m1, - format_info_p3109(4, 2, Domain.Finite), + format_info_p3109(4, 2, Signedness.Signed, Domain.Finite), format_info_ocp_e2m3, format_info_ocp_e3m2, - format_info_p3109(6, 3, Domain.Finite), - format_info_p3109(6, 4, Domain.Finite), + format_info_p3109(6, 3, Signedness.Signed, Domain.Finite), + format_info_p3109(6, 4, Signedness.Signed, Domain.Finite), ] p3109_binary8_formats = [ - format_info_p3109(8, p, domain, signedness) + format_info_p3109(8, p, signedness, domain) for p in (1, 3, 4) - for signedness in (True, False) + for signedness in (Signedness.Signed, Signedness.Unsigned) for domain in (Domain.Extended, Domain.Finite) ] diff --git a/src/gfloat/types.py b/src/gfloat/types.py index 3961f9c..d572708 100644 --- a/src/gfloat/types.py +++ b/src/gfloat/types.py @@ -45,6 +45,15 @@ class Domain(Enum): Extended = 2 #: Finite values and infinities +class Signedness(Enum): + """ + Enum for domain of values + """ + + Signed = 1 #: Positive and negative values + Unsigned = 2 #: Positive values only + + class FloatClass(Enum): """ Enum for the classification of a FloatValue. diff --git a/test/test_decode.py b/test/test_decode.py index ad5963b..3bd13fd 100644 --- a/test/test_decode.py +++ b/test/test_decode.py @@ -247,14 +247,14 @@ def test_p3109_k8_specials(fi: FormatInfo) -> None: @pytest.mark.parametrize("k,p", p3109_formats_to_test) def test_p3109_specials_signed(k: int, p: int) -> None: - fi = format_info_p3109(k, p, Domain.Extended) + fi = format_info_p3109(k, p, Signedness.Signed, Domain.Extended) assert fi.code_of_nan == 2 ** (k - 1) assert fi.code_of_zero == 0 assert fi.code_of_posinf == 2 ** (k - 1) - 1 assert fi.code_of_neginf == 2**k - 1 assert decode_float(fi, 2 ** (k - 2)).fval == 1.0 - fi = format_info_p3109(k, p, Domain.Finite) + fi = format_info_p3109(k, p, Signedness.Signed, Domain.Finite) assert fi.code_of_nan == 2 ** (k - 1) assert fi.code_of_zero == 0 assert decode_float(fi, 2 ** (k - 2)).fval == 1.0 @@ -266,7 +266,7 @@ def test_p3109_specials_signed(k: int, p: int) -> None: @pytest.mark.parametrize("k,p", p3109_formats_to_test) def test_p3109_specials_unsigned(k: int, p: int) -> None: - fi = format_info_p3109(k, p, Domain.Extended, signedness=False) + fi = format_info_p3109(k, p, Signedness.Unsigned, Domain.Extended) assert fi.code_of_nan == 2**k - 1 assert fi.code_of_zero == 0 assert fi.code_of_posinf == 2**k - 2 diff --git a/test/test_p3109_spec.py b/test/test_p3109_spec.py index a1ee5db..35adfe6 100644 --- a/test/test_p3109_spec.py +++ b/test/test_p3109_spec.py @@ -20,7 +20,11 @@ def spec_is_normal(fi: FormatInfo, x: int) -> bool: \end{cases} } """ - if x in (fi.code_of_zero, fi.code_of_posinf, fi.code_of_neginf, fi.code_of_nan): + if x in (fi.code_of_zero, fi.code_of_nan): + return False + if fi.num_neginfs > 0 and x == fi.code_of_neginf: + return False + if fi.num_posinfs > 0 and x == fi.code_of_posinf: return False k_f = fi.k @@ -52,8 +56,9 @@ def spec_is_normal(fi: FormatInfo, x: int) -> bool: @pytest.mark.parametrize("k,p", _p3109_formats_to_test) -def test_p3109_specials_signed(k: int, p: int) -> None: - fi = format_info_p3109(k, p, Domain.Extended) +@pytest.mark.parametrize("signedness", Signedness) +def test_p3109_specials_signed(k: int, p: int, signedness: Signedness) -> None: + fi = format_info_p3109(k, p, signedness, Domain.Extended) for i in range(2**fi.k): fv = decode_float(fi, i) From 6061f368544f6eedf249ebd7f191b9b239e976c9 Mon Sep 17 00:00:00 2001 From: Andrew Fitzgibbon Date: Thu, 21 Aug 2025 19:44:28 +0100 Subject: [PATCH 3/4] doc fixes, remove unused function --- README.md | 45 +- docs/source/01-decode.ipynb | 2 +- docs/source/02-value-stats.ipynb | 1111 ++++++++++++++++-------------- docs/source/index.rst | 2 +- src/gfloat/formats.py | 25 +- src/gfloat/types.py | 28 - test/test_array_api.py | 2 +- test/test_decode.py | 4 +- test/test_encode.py | 4 +- test/test_round.py | 2 +- 10 files changed, 632 insertions(+), 593 deletions(-) diff --git a/README.md b/README.md index 1b37a9c..ec3dc10 100644 --- a/README.md +++ b/README.md @@ -19,24 +19,35 @@ See https://gfloat.readthedocs.io for documentation, or dive into the notebooks For example, here's a table from the [02-value-stats](docs/source/02-value-stats.ipynb) notebook: -|name|B: Bits in the format|P: Precision in bits|E: Exponent field width in bits|0\n", "
ocp_e2m14p3109_k3p2sf3221 0.5 1 6 0 1.5 10
p3109_k4p2sfocp_e2m1422 0.25 0.5 3 1 0.5 1 6 00
ocp_e2m364p3109_k4p2sf422 0.125 1 7.5 0 0.25 0.5 3 10
ocp_e3m2ocp_e2m3633 0.0625 0.25 2842 0.125 1 7.5 00
p3109_k6p3sfocp_e3m2633 0.03125 0.125 14 1 0.0625 0.25 28 00
p3109_k6p4sfp3109_k6p3sf642 0.0625 0.5 3.7533 0.03125 0.125 14 10
ocp_e4m38p3109_k6p4sf644≈0.00195310.015625 448 22 0.0625 0.5 3.75 10
ocp_e5m2ocp_e4m3835≈1.5259e-05≈6.1035e-05 57344 6244≈0.00195310.015625 448 20
p3109_k8p1seocp_e5m2817≈1.0842e-19≈1.0842e-19≈4.6117e+18 135≈1.5259e-05≈6.1035e-05 57344 62
p3109_k8p1sfp3109_k8p1se817≈1.0842e-19≈1.0842e-19≈9.2234e+18≈4.6117e+18 102
p3109_k8p1ue1
p3109_k8p1ufp3109_k8p3se818≈5.8775e-39≈5.8775e-39≈8.5071e+3735≈7.6294e-06≈3.0518e-05 49152 102
p3109_k8p3sep3109_k8p3sf835≈7.6294e-06≈3.0518e-05 49152 57344 120
p3109_k8p3sfp3109_k8p3ue835≈7.6294e-06≈3.0518e-05 573446≈1.1642e-10≈4.6566e-10≈2.6844e+09 101
p3109_k8p3uep3109_k8p3uf836≈1.1642e-10≈4.6566e-10≈2.6844e+09≈3.2212e+09 110
p3109_k8p3ufp3109_k8p4se836≈1.1642e-10≈4.6566e-10≈3.2212e+0944≈0.000976560.0078125 224 102
p3109_k8p4sep3109_k8p4sf844≈0.000976560.0078125 224 240 120
p3109_k8p4sfp3109_k8p4ue844≈0.000976560.0078125 2405≈3.8147e-06≈3.0518e-05 53248 101
p3109_k8p4uep3109_k8p4uf845≈3.8147e-06≈3.0518e-05 53248 57344 110
p3109_k8p4ufp3109_k8p7sf845≈3.8147e-06≈3.0518e-05 57344710.015625 1≈ 1.9844 10
binary1616115≈5.9605e-08≈6.1035e-05 65504 20462p3109_k8p8uf8810.0078125 1≈ 1.9844 10
bfloat16binary161688≈9.1835e-41≈1.1755e-38≈3.3895e+38 254115≈5.9605e-08≈6.1035e-05 65504 20462
binary323224bfloat161688≈1.4013e-45≈9.1835e-41≈1.1755e-38≈3.4028e+38≈1.6777e+07≈3.3895e+38 2542
binary646453114.9407e-324≈2.2251e-308≈1.7977e+308≈9.0072e+15binary3232248≈1.4013e-45≈1.1755e-38≈3.4028e+38≈1.6777e+072
ocp_e8m0818≈5.8775e-39≈5.8775e-39≈1.7014e+38 10binary646453114.9407e-324≈2.2251e-308≈1.7977e+308≈9.0072e+152
ocp_int8ocp_e8m08800.015625n/a≈ 1.9844 018≈5.8775e-39≈5.8775e-39≈1.7014e+38 10
ocp_int88800.015625n/a≈ 1.9844 00
\n" ], @@ -393,7 +404,7 @@ " )\n", "\n", "\n", - "stats = [collect_stats(fi) for fi in all_formats]\n", + "stats = [collect_stats(fi) for fi in sample_formats]\n", "df = pandas.DataFrame(stats)\n", "D(df, format=partial(render_float, True))" ] @@ -441,144 +452,144 @@ " \n", "
ocp_e2m14p3109_k3p2sf3221TrueTrue151 0.5 0.5 1 6 1.5
p3109_k4p2sfocp_e2m1422TrueTrue33 0.25 0.25 0.5 315 0.5 0.5 1 6
ocp_e2m364p3109_k4p2sf422TrueTrue723 0.125 0.875 1 7.533 0.25 0.25 0.5 3
ocp_e3m2ocp_e2m363342TrueTrue1119 0.0625 0.1875 0.25 28723 0.125 0.875 1 7.5
p3109_k6p3sfocp_e3m2633TrueTrue1515 0.03125 0.09375 0.125 141119 0.0625 0.1875 0.25 28
p3109_k6p4sfp3109_k6p3sf64233TrueTrue1515 0.0625 0.4375 0.5 3.75 0.03125 0.09375 0.125 14
ocp_e4m38p3109_k6p4sf6442TrueTrue5570≈0.0019531≈0.0136720.015625 4481515 0.0625 0.4375 0.5 3.75
ocp_e5m2ocp_e4m383544TrueTrue5963≈1.5259e-05≈4.5776e-05≈6.1035e-05 573445570≈0.0019531≈0.0136720.015625 448
p3109_k8p1seocp_e5m2817False35TrueTrue6362n/an/a≈1.0842e-19≈4.6117e+185963≈1.5259e-05≈4.5776e-05≈6.1035e-05 57344
p3109_k8p1sfp3109_k8p1se817FalseTrue636362n/an/a≈1.0842e-19≈9.2234e+18≈4.6117e+18
p3109_k8p1ue≈4.2535e+37
p3109_k8p1ufp3109_k8p3se818False35TrueTrue127126n/an/a≈5.8775e-39≈8.5071e+376362≈7.6294e-06≈2.2888e-05≈3.0518e-05 49152
p3109_k8p3sep3109_k8p3sf835TrueTrue636263≈7.6294e-06≈2.2888e-05≈3.0518e-05 49152 57344
p3109_k8p3sfp3109_k8p3ue835True6FalseTrue6363≈7.6294e-06≈2.2888e-05≈3.0518e-05 57344127125≈1.1642e-10≈3.4925e-10≈4.6566e-10≈2.6844e+09
p3109_k8p3uep3109_k8p3uf836FalseTrue127125126≈1.1642e-10≈3.4925e-10≈4.6566e-10≈2.6844e+09≈3.2212e+09
p3109_k8p3ufp3109_k8p4se836False44TrueTrue127126≈1.1642e-10≈3.4925e-10≈4.6566e-10≈3.2212e+096362≈0.00097656≈0.00683590.0078125 224
p3109_k8p4sep3109_k8p4sf844TrueTrue636263≈0.00097656≈0.00683590.0078125 224 240
p3109_k8p4sfp3109_k8p4ue8445TrueTrue6363≈0.00097656≈0.00683590.0078125 240127125≈3.8147e-06≈2.6703e-05≈3.0518e-05 53248
p3109_k8p4uep3109_k8p4uf845TrueTrue127125126≈3.8147e-06≈2.6703e-05≈3.0518e-05 53248 57344
p3109_k8p4ufp3109_k8p7sf84571TrueTrue127126≈3.8147e-06≈2.6703e-05≈3.0518e-05 57344
binary161611563630.015625≈ 0.98438 1≈ 1.9844
p3109_k8p8uf881TrueTrue1535916383≈5.9605e-08≈6.0976e-05≈6.1035e-05 655041271260.0078125≈ 0.99219 1≈ 1.9844
bfloat16binary161688False115TrueTrue162551535916383≈9.1835e-41≈1.1663e-38≈1.1755e-38≈3.3895e+38≈5.9605e-08≈6.0976e-05≈6.1035e-05 65504
ocp_e8m081bfloat161688FalseTrue127127n/an/a≈5.8775e-39≈1.7014e+381625516383≈9.1835e-41≈1.1663e-38≈1.1755e-38≈3.3895e+38
ocp_int8ocp_e8m0880True18FalseTrue63630.015625≈ 1.9844n/an/a127127n/an/a≈5.8775e-39≈1.7014e+38
ocp_int8880TrueTrue63630.015625≈ 1.9844n/an/a
\n" @@ -853,7 +878,7 @@ " )\n", "\n", "\n", - "stats = [compute_stats(fi) for fi in all_formats if fi.bits <= 16]\n", + "stats = [compute_stats(fi) for fi in sample_formats if fi.bits <= 16]\n", "df2 = pandas.DataFrame(stats)\n", "D(df2, format=partial(render_float, True))" ] @@ -897,144 +922,144 @@ " \n", "
ocp_e2m14p3109_k3p2sf3221TrueTrue151 0.5 0.5 1 6 1.5
p3109_k4p2sfocp_e2m1422TrueTrue33 0.25 0.25 0.5 315 0.5 0.5 1 6
ocp_e2m364p3109_k4p2sf422TrueTrue723 0.125 0.875 1 7.533 0.25 0.25 0.5 3
ocp_e3m2ocp_e2m363342TrueTrue1119 0.0625 0.1875 0.25 28723 0.125 0.875 1 7.5
p3109_k6p3sfocp_e3m2633TrueTrue1515 0.03125 0.09375 0.125 141119 0.0625 0.1875 0.25 28
p3109_k6p4sfp3109_k6p3sf64233TrueTrue1515 0.0625 0.4375 0.5 3.75 0.03125 0.09375 0.125 14
ocp_e4m38p3109_k6p4sf6442TrueTrue55702^-97/4*2^-70.015625 4481515 0.0625 0.4375 0.5 3.75
ocp_e5m2ocp_e4m383544TrueTrue59632^-163/2*2^-152^-14 5734455702^-97/4*2^-70.015625 448
p3109_k8p1seocp_e5m2817False35TrueTrue6362n/an/a2^-632^6259632^-163/2*2^-152^-14 57344
p3109_k8p1sfp3109_k8p1se817FalseTrue636362n/an/a2^-632^632^62
p3109_k8p1ue2^125
p3109_k8p1ufp3109_k8p3se818False35TrueTrue127126n/an/a2^-1272^12663622^-173/2*2^-162^-15 49152
p3109_k8p3sep3109_k8p3sf835TrueTrue6362632^-173/2*2^-162^-15 49152 57344
p3109_k8p3sfp3109_k8p3ue835True6FalseTrue63632^-173/2*2^-162^-15 573441271252^-333/2*2^-322^-315/4*2^31
p3109_k8p3uep3109_k8p3uf836FalseTrue1271251262^-333/2*2^-322^-315/4*2^313/2*2^31
p3109_k8p3ufp3109_k8p4se836False44TrueTrue1271262^-333/2*2^-322^-313/2*2^3163622^-107/4*2^-80.0078125 224
p3109_k8p4sep3109_k8p4sf844TrueTrue6362632^-107/4*2^-80.0078125 224 240
p3109_k8p4sfp3109_k8p4ue8445TrueTrue63632^-107/4*2^-80.0078125 2401271252^-187/4*2^-162^-15 53248
p3109_k8p4uep3109_k8p4uf845TrueTrue1271251262^-187/4*2^-162^-15 53248 57344
p3109_k8p4ufp3109_k8p7sf84571TrueTrue1271262^-187/4*2^-162^-15 57344
binary161611563630.01562563/32*2^-1 1127/64*2^0
p3109_k8p8uf881TrueTrue15359163832^-241023/512*2^-152^-14 655041271260.0078125127/64*2^-1 1127/64*2^0
bfloat16binary161688False115TrueTrue1625515359163832^-133127/64*2^-1272^-126255/128*2^1272^-241023/512*2^-152^-14 65504
ocp_e8m081bfloat161688FalseTrue127127n/an/a2^-1272^12716255163832^-133127/64*2^-1272^-126255/128*2^127
ocp_int8ocp_e8m0880True18FalseTrue63630.015625127/64*2^0n/an/a127127n/an/a2^-1272^127
ocp_int8880TrueTrue63630.015625127/64*2^0n/an/a
\n" @@ -1303,9 +1342,9 @@ "]\n", "\n", "stats = [compute_stats(fi) for fi in all_p3109]\n", - "df2 = pandas.DataFrame(stats)\n", - "df2[\"rt32\"].all()\n", - "# D(df2, format=partial(render_float, True))" + "df3 = pandas.DataFrame(stats)\n", + "df3[\"rt32\"].all()\n", + "# D(df3, format=partial(render_float, True))" ] }, { @@ -1330,6 +1369,7 @@ "============ === === === =========== ================= ============ =========== ======\n", "name B P E smallest smallest_normal max num_nans infs\n", "============ === === === =========== ================= ============ =========== ======\n", + "p3109_k3p2sf 3 2 1 0.5 1 1.5 1 0\n", "ocp_e2m1 4 2 2 0.5 1 6 0 0\n", "p3109_k4p2sf 4 2 2 0.25 0.5 3 1 0\n", "ocp_e2m3 6 4 2 0.125 1 7.5 0 0\n", @@ -1339,9 +1379,7 @@ "ocp_e4m3 8 4 4 ≈0.0019531 0.015625 448 2 0\n", "ocp_e5m2 8 3 5 ≈1.5259e-05 ≈6.1035e-05 57344 6 2\n", "p3109_k8p1se 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈4.6117e+18 1 2\n", - "p3109_k8p1sf 8 1 7 ≈1.0842e-19 ≈1.0842e-19 ≈9.2234e+18 1 0\n", "p3109_k8p1ue 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈4.2535e+37 1 1\n", - "p3109_k8p1uf 8 1 8 ≈5.8775e-39 ≈5.8775e-39 ≈8.5071e+37 1 0\n", "p3109_k8p3se 8 3 5 ≈7.6294e-06 ≈3.0518e-05 49152 1 2\n", "p3109_k8p3sf 8 3 5 ≈7.6294e-06 ≈3.0518e-05 57344 1 0\n", "p3109_k8p3ue 8 3 6 ≈1.1642e-10 ≈4.6566e-10 ≈2.6844e+09 1 1\n", @@ -1350,6 +1388,8 @@ "p3109_k8p4sf 8 4 4 ≈0.00097656 0.0078125 240 1 0\n", "p3109_k8p4ue 8 4 5 ≈3.8147e-06 ≈3.0518e-05 53248 1 1\n", "p3109_k8p4uf 8 4 5 ≈3.8147e-06 ≈3.0518e-05 57344 1 0\n", + "p3109_k8p7sf 8 7 1 0.015625 1 ≈ 1.9844 1 0\n", + "p3109_k8p8uf 8 8 1 0.0078125 1 ≈ 1.9844 1 0\n", "binary16 16 11 5 ≈5.9605e-08 ≈6.1035e-05 65504 2046 2\n", "bfloat16 16 8 8 ≈9.1835e-41 ≈1.1755e-38 ≈3.3895e+38 254 2\n", "binary32 32 24 8 ≈1.4013e-45 ≈1.1755e-38 ≈3.4028e+38 ≈1.6777e+07 2\n", @@ -1381,6 +1421,7 @@ "============ === === === =========== ================= ======================================== ====================================== ======\n", "name B P E smallest smallest_normal max num_nans infs\n", "============ === === === =========== ================= ======================================== ====================================== ======\n", + "p3109_k3p2sf 3 2 1 0.5 1 1.5 1 0\n", "ocp_e2m1 4 2 2 0.5 1 6 0 0\n", "p3109_k4p2sf 4 2 2 0.25 0.5 3 1 0\n", "ocp_e2m3 6 4 2 0.125 1 7.5 0 0\n", @@ -1390,9 +1431,7 @@ "ocp_e4m3 8 4 4 2^-9 0.015625 448 2 0\n", "ocp_e5m2 8 3 5 2^-16 2^-14 57344 6 2\n", "p3109_k8p1se 8 1 7 2^-63 2^-63 2^62 1 2\n", - "p3109_k8p1sf 8 1 7 2^-63 2^-63 2^63 1 0\n", "p3109_k8p1ue 8 1 8 2^-127 2^-127 2^125 1 1\n", - "p3109_k8p1uf 8 1 8 2^-127 2^-127 2^126 1 0\n", "p3109_k8p3se 8 3 5 2^-17 2^-15 49152 1 2\n", "p3109_k8p3sf 8 3 5 2^-17 2^-15 57344 1 0\n", "p3109_k8p3ue 8 3 6 2^-33 2^-31 5/4*2^31 1 1\n", @@ -1401,6 +1440,8 @@ "p3109_k8p4sf 8 4 4 2^-10 0.0078125 240 1 0\n", "p3109_k8p4ue 8 4 5 2^-18 2^-15 53248 1 1\n", "p3109_k8p4uf 8 4 5 2^-18 2^-15 57344 1 0\n", + "p3109_k8p7sf 8 7 1 0.015625 1 127/64*2^0 1 0\n", + "p3109_k8p8uf 8 8 1 0.0078125 1 127/64*2^0 1 0\n", "binary16 16 11 5 2^-24 2^-14 65504 2046 2\n", "bfloat16 16 8 8 2^-133 2^-126 255/128*2^127 254 2\n", "binary32 32 24 8 2^-149 2^-126 16777215/8388608*2^127 8388607/4194304*2^23 2\n", @@ -1427,39 +1468,43 @@ "name": "stdout", "output_type": "stream", "text": [ - "| | name | B | P | E | smallest | smallest_normal | max | num_nans | infs |\n", - "|---:|:-------------|----:|----:|----:|-------------:|------------------:|-----------------:|---------------:|-------:|\n", - "| 0 | ocp_e2m1 | 4 | 2 | 2 | 0.5 | 1 | 6 | 0 | 0 |\n", - "| 1 | p3109_k4p2sf | 4 | 2 | 2 | 0.25 | 0.5 | 3 | 1 | 0 |\n", - "| 2 | ocp_e2m3 | 6 | 4 | 2 | 0.125 | 1 | 7.5 | 0 | 0 |\n", - "| 3 | ocp_e3m2 | 6 | 3 | 3 | 0.0625 | 0.25 | 28 | 0 | 0 |\n", - "| 4 | p3109_k6p3sf | 6 | 3 | 3 | 0.03125 | 0.125 | 14 | 1 | 0 |\n", - "| 5 | p3109_k6p4sf | 6 | 4 | 2 | 0.0625 | 0.5 | 3.75 | 1 | 0 |\n", - "| 6 | ocp_e4m3 | 8 | 4 | 4 | 0.00195312 | 0.015625 | 448 | 2 | 0 |\n", - "| 7 | ocp_e5m2 | 8 | 3 | 5 | 1.52588e-05 | 6.10352e-05 | 57344 | 6 | 2 |\n", - "| 8 | p3109_k8p1se | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 4.61169e+18 | 1 | 2 |\n", - "| 9 | p3109_k8p1sf | 8 | 1 | 7 | 1.0842e-19 | 1.0842e-19 | 9.22337e+18 | 1 | 0 |\n", - "| 10 | p3109_k8p1ue | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 4.25353e+37 | 1 | 1 |\n", - "| 11 | p3109_k8p1uf | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 8.50706e+37 | 1 | 0 |\n", - "| 12 | p3109_k8p3se | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 49152 | 1 | 2 |\n", - "| 13 | p3109_k8p3sf | 8 | 3 | 5 | 7.62939e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", - "| 14 | p3109_k8p3ue | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 2.68435e+09 | 1 | 1 |\n", - "| 15 | p3109_k8p3uf | 8 | 3 | 6 | 1.16415e-10 | 4.65661e-10 | 3.22123e+09 | 1 | 0 |\n", - "| 16 | p3109_k8p4se | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 224 | 1 | 2 |\n", - "| 17 | p3109_k8p4sf | 8 | 4 | 4 | 0.000976562 | 0.0078125 | 240 | 1 | 0 |\n", - "| 18 | p3109_k8p4ue | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 53248 | 1 | 1 |\n", - "| 19 | p3109_k8p4uf | 8 | 4 | 5 | 3.8147e-06 | 3.05176e-05 | 57344 | 1 | 0 |\n", - "| 20 | binary16 | 16 | 11 | 5 | 5.96046e-08 | 6.10352e-05 | 65504 | 2046 | 2 |\n", - "| 21 | bfloat16 | 16 | 8 | 8 | 9.18355e-41 | 1.17549e-38 | 3.38953e+38 | 254 | 2 |\n", - "| 22 | binary32 | 32 | 24 | 8 | 1.4013e-45 | 1.17549e-38 | 3.40282e+38 | 1.67772e+07 | 2 |\n", - "| 23 | binary64 | 64 | 53 | 11 | 4.94066e-324 | 2.22507e-308 | 1.79769e+308 | 9.0072e+15 | 2 |\n", - "| 24 | ocp_e8m0 | 8 | 1 | 8 | 5.87747e-39 | 5.87747e-39 | 1.70141e+38 | 1 | 0 |\n", - "| 25 | ocp_int8 | 8 | 8 | 0 | 0.015625 | nan | 1.98438 | 0 | 0 |\n" + "| name | B | P | E | rt16 | rt32 | lt1 | gt1 | minSubnormal | maxSubnormal | minNormal | maxNormal |\n", + "|--------------|-----|-----|-----|--------|--------|-------|-------|----------------|----------------|-------------|---------------|\n", + "| p3109_k3p2sf | 3 | 2 | 1 | True | True | 1 | 1 | 0.5 | 0.5 | 1 | 1.5 |\n", + "| ocp_e2m1 | 4 | 2 | 2 | True | True | 1 | 5 | 0.5 | 0.5 | 1 | 6 |\n", + "| p3109_k4p2sf | 4 | 2 | 2 | True | True | 3 | 3 | 0.25 | 0.25 | 0.5 | 3 |\n", + "| ocp_e2m3 | 6 | 4 | 2 | True | True | 7 | 23 | 0.125 | 0.875 | 1 | 7.5 |\n", + "| ocp_e3m2 | 6 | 3 | 3 | True | True | 11 | 19 | 0.0625 | 0.1875 | 0.25 | 28 |\n", + "| p3109_k6p3sf | 6 | 3 | 3 | True | True | 15 | 15 | 0.03125 | 0.09375 | 0.125 | 14 |\n", + "| p3109_k6p4sf | 6 | 4 | 2 | True | True | 15 | 15 | 0.0625 | 0.4375 | 0.5 | 3.75 |\n", + "| ocp_e4m3 | 8 | 4 | 4 | True | True | 55 | 70 | 2^-9 | 7/4*2^-7 | 0.015625 | 448 |\n", + "| ocp_e5m2 | 8 | 3 | 5 | True | True | 59 | 63 | 2^-16 | 3/2*2^-15 | 2^-14 | 57344 |\n", + "| p3109_k8p1se | 8 | 1 | 7 | False | True | 63 | 62 | n/a | n/a | 2^-63 | 2^62 |\n", + "| p3109_k8p1ue | 8 | 1 | 8 | False | True | 127 | 125 | n/a | n/a | 2^-127 | 2^125 |\n", + "| p3109_k8p3se | 8 | 3 | 5 | True | True | 63 | 62 | 2^-17 | 3/2*2^-16 | 2^-15 | 49152 |\n", + "| p3109_k8p3sf | 8 | 3 | 5 | True | True | 63 | 63 | 2^-17 | 3/2*2^-16 | 2^-15 | 57344 |\n", + "| p3109_k8p3ue | 8 | 3 | 6 | False | True | 127 | 125 | 2^-33 | 3/2*2^-32 | 2^-31 | 5/4*2^31 |\n", + "| p3109_k8p3uf | 8 | 3 | 6 | False | True | 127 | 126 | 2^-33 | 3/2*2^-32 | 2^-31 | 3/2*2^31 |\n", + "| p3109_k8p4se | 8 | 4 | 4 | True | True | 63 | 62 | 2^-10 | 7/4*2^-8 | 0.0078125 | 224 |\n", + "| p3109_k8p4sf | 8 | 4 | 4 | True | True | 63 | 63 | 2^-10 | 7/4*2^-8 | 0.0078125 | 240 |\n", + "| p3109_k8p4ue | 8 | 4 | 5 | True | True | 127 | 125 | 2^-18 | 7/4*2^-16 | 2^-15 | 53248 |\n", + "| p3109_k8p4uf | 8 | 4 | 5 | True | True | 127 | 126 | 2^-18 | 7/4*2^-16 | 2^-15 | 57344 |\n", + "| p3109_k8p7sf | 8 | 7 | 1 | True | True | 63 | 63 | 0.015625 | 63/32*2^-1 | 1 | 127/64*2^0 |\n", + "| p3109_k8p8uf | 8 | 8 | 1 | True | True | 127 | 126 | 0.0078125 | 127/64*2^-1 | 1 | 127/64*2^0 |\n", + "| binary16 | 16 | 11 | 5 | True | True | 15359 | 16383 | 2^-24 | 1023/512*2^-15 | 2^-14 | 65504 |\n", + "| bfloat16 | 16 | 8 | 8 | False | True | 16255 | 16383 | 2^-133 | 127/64*2^-127 | 2^-126 | 255/128*2^127 |\n", + "| ocp_e8m0 | 8 | 1 | 8 | False | True | 127 | 127 | n/a | n/a | 2^-127 | 2^127 |\n", + "| ocp_int8 | 8 | 8 | 0 | True | True | 63 | 63 | 0.015625 | 127/64*2^0 | n/a | n/a |\n" ] } ], "source": [ - "print(df.to_markdown())" + "dfstr = df2.map(lambda x: render_float(False, x))\n", + "print(\n", + " tabulate(dfstr, df2.columns, tablefmt=\"github\", showindex=False).replace(\n", + " \" nan\", \" n/a\"\n", + " )\n", + ")" ] } ], diff --git a/docs/source/index.rst b/docs/source/index.rst index 0477468..f103b78 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -46,7 +46,7 @@ handling various current and proposed floating point types: - `IEEE 754 `_: Binary16, Binary32 - `Brain floating point `_: BFloat16 - - |p3109_link|: P3109_{K}p{P} for K > 2, and 1 <= P < K. + - |p3109_link|: P3109_{K}p{P}{s}{d} for K > 2, and 1 <= P <= K, Signedness, and Domain - |ocp_link|: E5M2, E4M3 - Types from the |ocp_mx_link| spec: E8M0, INT8, and FP4, FP6 types diff --git a/src/gfloat/formats.py b/src/gfloat/formats.py index 930fd27..f8e251b 100644 --- a/src/gfloat/formats.py +++ b/src/gfloat/formats.py @@ -212,6 +212,7 @@ def format_info_p3109( # Collections of formats _tiny_formats = [ + format_info_p3109(3, 2, Signedness.Signed, Domain.Finite), format_info_ocp_e2m1, format_info_p3109(4, 2, Signedness.Signed, Domain.Finite), format_info_ocp_e2m3, @@ -220,12 +221,22 @@ def format_info_p3109( format_info_p3109(6, 4, Signedness.Signed, Domain.Finite), ] -p3109_binary8_formats = [ - format_info_p3109(8, p, signedness, domain) - for p in (1, 3, 4) - for signedness in (Signedness.Signed, Signedness.Unsigned) - for domain in (Domain.Extended, Domain.Finite) -] +p3109_binary8_formats = ( + [ + format_info_p3109(8, 1, Signedness.Signed, Domain.Extended), + format_info_p3109(8, 1, Signedness.Unsigned, Domain.Extended), + ] + + [ + format_info_p3109(8, p, signedness, domain) + for p in (3, 4) + for signedness in (Signedness.Signed, Signedness.Unsigned) + for domain in (Domain.Extended, Domain.Finite) + ] + + [ + format_info_p3109(8, 7, Signedness.Signed, Domain.Finite), + format_info_p3109(8, 8, Signedness.Unsigned, Domain.Finite), + ] +) _fp8_formats = [ format_info_ocp_e4m3, @@ -238,7 +249,7 @@ def format_info_p3109( format_info_bfloat16, ] -all_formats = [ +sample_formats = [ *_tiny_formats, *_fp8_formats, *_fp16_formats, diff --git a/src/gfloat/types.py b/src/gfloat/types.py index d572708..316cb2a 100644 --- a/src/gfloat/types.py +++ b/src/gfloat/types.py @@ -256,34 +256,6 @@ def max(self) -> float: else: return 2 ** (emax - self.bias) * (1.0 + isig * 2**-self.tSignificandBits) - @property - def e_and_sig_of_max(self) -> float: - """ - Exponent and significand of the largest representable number. - """ - num_non_finites = self.num_high_nans + self.num_posinfs - if num_non_finites == 2**self.tSignificandBits: - # All-bits-one exponent field is full, value is in the - # binade below, so significand is 0xFFF..F - isig = 2**self.tSignificandBits - 1 - emax = 2**self.expBits - 2 - elif num_non_finites == 2 ** (self.tSignificandBits + 1): - # Top two binades are full, value is in the - # binade below them. Significand is still 0xFFF..F - isig = 2**self.tSignificandBits - 1 - emax = 2**self.expBits - 3 - else: - assert num_non_finites < 2**self.tSignificandBits - # All-bits-one exponent field is not full, value is in the - # final binade, so significand is 0xFFF..F - num_non_finites - isig = 2**self.tSignificandBits - 1 - num_non_finites - emax = 2**self.expBits - 1 - - if self.is_all_subnormal: - return 2 ** (emax - self.bias) * (isig * 2 ** (1 - self.tSignificandBits)) - else: - return 2 ** (emax - self.bias) * (1.0 + isig * 2**-self.tSignificandBits) - @property def maxexp(self) -> int: """ diff --git a/test/test_array_api.py b/test/test_array_api.py index 4e79732..832c2d7 100644 --- a/test/test_array_api.py +++ b/test/test_array_api.py @@ -17,7 +17,7 @@ xp.set_array_api_strict_flags(api_version="2024.12") -@pytest.mark.parametrize("fi", all_formats) +@pytest.mark.parametrize("fi", sample_formats) @pytest.mark.parametrize("rnd", RoundMode) @pytest.mark.parametrize("sat", [True, False]) def test_array_api(fi: FormatInfo, rnd: RoundMode, sat: bool) -> None: diff --git a/test/test_decode.py b/test/test_decode.py index 3bd13fd..fb65daa 100644 --- a/test/test_decode.py +++ b/test/test_decode.py @@ -275,7 +275,7 @@ def test_p3109_specials_unsigned(k: int, p: int) -> None: fi.code_of_neginf -@pytest.mark.parametrize("fi", all_formats) +@pytest.mark.parametrize("fi", sample_formats) @pytest.mark.parametrize("method", methods) def test_specials_decode(method: str, fi: FormatInfo) -> None: dec = decode_for_method(method, fi) @@ -335,7 +335,7 @@ def test_except(v: int) -> None: decode_float(format_info_binary16, v) -@pytest.mark.parametrize("fi", [fi for fi in all_formats if fi.bits <= 8]) +@pytest.mark.parametrize("fi", [fi for fi in sample_formats if fi.bits <= 8]) def test_dense(fi: FormatInfo) -> None: fvs = [decode_float(fi, i) for i in range(0, 2**fi.bits)] diff --git a/test/test_encode.py b/test/test_encode.py index 0888a4f..efdaa1f 100644 --- a/test/test_encode.py +++ b/test/test_encode.py @@ -10,7 +10,7 @@ from gfloat.formats import * -@pytest.mark.parametrize("fi", all_formats) +@pytest.mark.parametrize("fi", sample_formats) def test_encode(fi: FormatInfo) -> None: dec = lambda v: decode_float(fi, v).fval @@ -42,7 +42,7 @@ def test_encode(fi: FormatInfo) -> None: np.testing.assert_equal(enc_codes, expected_codes) -@pytest.mark.parametrize("fi", all_formats) +@pytest.mark.parametrize("fi", sample_formats) @pytest.mark.parametrize("enc", (encode_float, encode_ndarray)) def test_encode_edges(fi: FormatInfo, enc: Callable) -> None: if enc == encode_ndarray: diff --git a/test/test_round.py b/test/test_round.py index ab40156..3e56d43 100644 --- a/test/test_round.py +++ b/test/test_round.py @@ -473,7 +473,7 @@ def test_round_ints(round_float: Callable, fi: FormatInfo, mldtype: Type) -> Non np.testing.assert_equal(val, mlval) -@pytest.mark.parametrize("fi", all_formats) +@pytest.mark.parametrize("fi", sample_formats) @pytest.mark.parametrize("round_float", (rnd_scalar, rnd_array)) def test_round_roundtrip(round_float: Callable, fi: FormatInfo) -> None: if fi.bits <= 8: From 742de2fd58a1c89c4c0fc68251a3fe74eb8e9843 Mon Sep 17 00:00:00 2001 From: Andrew Fitzgibbon Date: Fri, 22 Aug 2025 10:18:53 +0100 Subject: [PATCH 4/4] import Signedness --- docs/source/conf.py | 4 ++-- etc/package.sh | 2 +- pyproject.toml | 2 +- src/gfloat/__init__.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 2734c2b..976571a 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -7,8 +7,8 @@ project = "GFloat" copyright = "2024, Graphcore Ltd" author = "Andrew Fitzgibbon" -release = "0.5" # Set version in package.sh -version = "0.5" # Set version in package.sh +release = "0.5.2" # Set version in package.sh +version = "0.5.2" # Set version in package.sh # -- General configuration diff --git a/etc/package.sh b/etc/package.sh index 779eeaf..fc5e56d 100644 --- a/etc/package.sh +++ b/etc/package.sh @@ -5,7 +5,7 @@ set -o errexit # This is the master location at which to change version number -VERSION="0.5" +VERSION="0.5.2" # Run the script to change the version elsewhere perl -pi -e 's/^(release|version) = "([\d.]+)"/$1 = "'$VERSION'"/' docs/source/conf.py diff --git a/pyproject.toml b/pyproject.toml index dfe6faa..5772f15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,7 +10,7 @@ package-dir = {"" = "src"} [project] name = "gfloat" -version = "0.5" # Set version in package.sh +version = "0.5.2" # Set version in package.sh authors = [ {name = "Andrew Fitzgibbon", email = "awf@fitzgibbon.ie"}, ] diff --git a/src/gfloat/__init__.py b/src/gfloat/__init__.py index 1178415..9636efe 100644 --- a/src/gfloat/__init__.py +++ b/src/gfloat/__init__.py @@ -14,7 +14,7 @@ from .round_ndarray import round_ndarray from .encode_ndarray import encode_ndarray from .decode_ndarray import decode_ndarray -from .types import FloatClass, FloatValue, FormatInfo, Domain, RoundMode +from .types import FloatClass, FloatValue, FormatInfo, Signedness, Domain, RoundMode # Don't automatically import from .formats. # If the user wants them in their namespace, they can explicitly import