{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "# GFloat Basics\n", "\n", "This notebook shows the use of `decode_float` to explore properties of some float formats.\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Install packages\n", "from pandas import DataFrame\n", "import numpy as np\n", "\n", "from gfloat import decode_float\n", "from gfloat.formats import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## List all the values in a format\n", "\n", "The first example shows how to list all values in a given format.\n", "We will choose the [OCP](https://www.opencompute.org/documents/ocp-8-bit-floating-point-specification-ofp8-revision-1-0-2023-12-01-pdf-1) E5M2 format.\n", "\n", "The object `format_info_ocp_e5m2` is from the `gfloat.formats` package, and describes the characteristics of that format:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "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, "metadata": {}, "output_type": "execute_result" } ], "source": [ "format_info_ocp_e5m2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We shall use the format to decode all values from 0..255, and gather them in a pandas DataFrame.\n", "We see that `decode_float` returns a lot more than just the value - it also splits out the exponent, significand, and sign, and returns the `FloatClass`, which allows us to distinguish normal and subnormal numbers, as well as zero, infinity, and nan." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fvalexpexpvalsignificandfsignificandsignbitfclass
code
00.000000e+000-1400.000FloatClass.ZERO
11.525879e-050-1410.250FloatClass.SUBNORMAL
23.051758e-050-1420.500FloatClass.SUBNORMAL
34.577637e-050-1430.750FloatClass.SUBNORMAL
46.103516e-051-1401.000FloatClass.NORMAL
........................
251-5.734400e+04301531.751FloatClass.NORMAL
252-inf311601.001FloatClass.INFINITE
253NaN311611.251FloatClass.NAN
254NaN311621.501FloatClass.NAN
255NaN311631.751FloatClass.NAN
\n", "

256 rows × 7 columns

\n", "
" ], "text/plain": [ " fval exp expval significand fsignificand signbit \\\n", "code \n", "0 0.000000e+00 0 -14 0 0.00 0 \n", "1 1.525879e-05 0 -14 1 0.25 0 \n", "2 3.051758e-05 0 -14 2 0.50 0 \n", "3 4.577637e-05 0 -14 3 0.75 0 \n", "4 6.103516e-05 1 -14 0 1.00 0 \n", "... ... ... ... ... ... ... \n", "251 -5.734400e+04 30 15 3 1.75 1 \n", "252 -inf 31 16 0 1.00 1 \n", "253 NaN 31 16 1 1.25 1 \n", "254 NaN 31 16 2 1.50 1 \n", "255 NaN 31 16 3 1.75 1 \n", "\n", " fclass \n", "code \n", "0 FloatClass.ZERO \n", "1 FloatClass.SUBNORMAL \n", "2 FloatClass.SUBNORMAL \n", "3 FloatClass.SUBNORMAL \n", "4 FloatClass.NORMAL \n", "... ... \n", "251 FloatClass.NORMAL \n", "252 FloatClass.INFINITE \n", "253 FloatClass.NAN \n", "254 FloatClass.NAN \n", "255 FloatClass.NAN \n", "\n", "[256 rows x 7 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fmt = format_info_ocp_e5m2\n", "vals = [decode_float(fmt, i) for i in range(256)]\n", "DataFrame(vals).set_index(\"code\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Plot the values in some 6-bit formats\n", "\n", "This is a plot of the positive values in each format, as a function of their integer \n", "codepoint. Subnormal values are indicated, illustrating the increased dynamic range \n", "they offer. (More on this below.)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "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": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "from gfloat import decode_ndarray\n", "\n", "plt.figure(figsize=(12, 6))\n", "code = np.arange(0, 2**6)\n", "for fi in (\n", " format_info_ocp_e3m2,\n", " format_info_ocp_e2m3,\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", " subnormal = val < fi.smallest_normal\n", " if \"ocp\" in str(fi):\n", " nsty = dict(marker=\"o\", markersize=5, linestyle=\"None\")\n", " snsty = dict(marker=\"o\", markersize=5, linestyle=\"None\", markerfacecolor=\"none\")\n", " else:\n", " nsty = dict(marker=\"s\", markersize=3.5, linestyle=\"None\")\n", " snsty = dict(marker=\"s\", markersize=3.5, linestyle=\"None\", markerfacecolor=\"none\")\n", " (p,) = plt.plot(\n", " code[valid & ~subnormal], val[valid & ~subnormal], label=fi.name, **nsty\n", " )\n", " (hsub,) = plt.plot(\n", " code[valid & subnormal],\n", " val[valid & subnormal],\n", " label=None,\n", " color=p.get_color(),\n", " **snsty,\n", " )\n", "\n", "plt.plot(np.nan, np.nan, label=\"Subnormal values\", color=\"k\", **snsty)\n", "plt.yscale(\"log\")\n", "plt.legend()\n", "None # suppress output" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Additional format info: special values, min, max, dynamic range\n", "\n", "In addition, `FormatInfo` can tell us about other characteristics of each format.\n", "To reproduce some of the OCP spec's tables 1 and 2 (and adding P3109 `binary8p3se`)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "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", "Number of zeros 2 2 1\n", "Max exponent (emax) 8 15 15\n", "Max normal number 448.0 57344.0 49152.0\n", "Min normal number 0.015625 6.103515625e-05 3.0517578125e-05\n", "Min subnormal number 0.001953125 1.52587890625e-05 7.62939453125e-06\n", "Dynamic range (binades) 18 32 33\n" ] } ], "source": [ "def compute_dynamic_range(fi):\n", " return np.log2(fi.max / fi.smallest)\n", "\n", "\n", "for prop, probe in (\n", " (\"Format \", lambda fi: fi.name.replace(\"format_info_\", \"\")),\n", " (\"Exponent bias \", lambda fi: fi.bias),\n", " (\"Infinities \", lambda fi: 2 * fi.num_posinfs),\n", " (\"Number of NaNs \", lambda fi: fi.num_nans),\n", " (\"Number of zeros \", lambda fi: int(fi.has_zero) + int(fi.has_nz)),\n", " (\"Max exponent (emax) \", lambda fi: fi.emax),\n", " (\"Max normal number \", lambda fi: fi.max),\n", " (\"Min normal number \", lambda fi: fi.smallest_normal),\n", " (\"Min subnormal number \", lambda fi: fi.smallest_subnormal),\n", " (\"Dynamic range (binades)\", lambda x: round(compute_dynamic_range(x))),\n", "):\n", " print(\n", " prop,\n", " f\"{probe(format_info_ocp_e4m3):<20}\",\n", " f\"{probe(format_info_ocp_e5m2):<20}\",\n", " f\"{probe(format_info_p3109(8, 3))}\",\n", " )" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## How do subnormals affect dynamic range?\n", "\n", "Most, if not all, low-precision formats include subnormal numbers, as they increase the number of values near zero, and increase dynamic range.\n", "A natural question is \"by how much?\". To answer this, we can create a mythical new format, a copy of `e4m3`, but with `has_subnormals` set to true." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import copy\n", "\n", "e4m3_no_subnormals = copy.copy(format_info_ocp_e4m3)\n", "e4m3_no_subnormals.has_subnormals = False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And now compute the dynamic range with and without:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dynamic range with subnormals = 17.807354922057606\n", "Dynamic range without subnormals = 15.637429920615292\n", "Ratio = 4.5\n" ] } ], "source": [ "dr_with = compute_dynamic_range(format_info_ocp_e4m3)\n", "dr_without = compute_dynamic_range(e4m3_no_subnormals)\n", "\n", "print(f\"Dynamic range with subnormals = {dr_with}\")\n", "print(f\"Dynamic range without subnormals = {dr_without}\")\n", "print(f\"Ratio = {2**(dr_with - dr_without):.1f}\")" ] } ], "metadata": { "kernelspec": { "display_name": "gfloat", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }