{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<!-- # Copyright (c) 2024 Graphcore Ltd. All rights reserved. -->\n",
    "\n",
    "# Collect value statistics for formats\n",
    "\n",
    "This notebook computes various statistics for a variety of float formats,\n",
    "by exhaustively enumerating the values.  Naturally, most of these statistics can be computed directly, and indeed many are already supplied on the `FormatInfo` class as methods, for example `max`, `smallest_subnormal`, etc.  However this method serves as a useful cross-check against the direct formulae.\n",
    "\n",
    "## Statistics collected\n",
    "\n",
    " - name: Format\n",
    " - B: Bits in the format\n",
    " - P: Precision in bits\n",
    " - E: Exponent field width in bits\n",
    " - T: Trailing significand field width in bits\n",
    " - lt1: Number of values x such that `0 < x < 1`\n",
    " - gt1: Number of values x such that `1 < x < Inf`\n",
    " - rt16: True if all values are exactly representable in IEEE binary16\n",
    " - maxFinite: Largest finite value\n",
    " - minFinite: Smallest finite value\n",
    " - maxNormal: Largest finite normal value, NaN if all finite values are subnormal\n",
    " - minNormal: Smallest positive normal value, NaN if all finite values are subnormal\n",
    " - minSubnormal: Smallest positive subnormal value, NaN if no finite values are  - subnormal\n",
    " - maxSubnormal: Largest subnormal value, NaN if no finite values are subnormal\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from gfloat import *\n",
    "from gfloat.formats import *\n",
    "\n",
    "import pandas\n",
    "import numpy as np\n",
    "from IPython.display import HTML\n",
    "\n",
    "\n",
    "def collect_stats(fi: FormatInfo):\n",
    "    # Generate all values\n",
    "    values = [decode_float(fi, i) for i in range(2**fi.bits)]\n",
    "    df = pandas.DataFrame(values)\n",
    "\n",
    "    # Extract format information parameters\n",
    "    E = fi.expBits\n",
    "    S = fi.tSignificandBits\n",
    "\n",
    "    # Compute statistics: lt1,gt1\n",
    "    fval = df[\"fval\"]\n",
    "    total_01 = fval.between(0, 1, inclusive=\"neither\").sum()\n",
    "    total_1Inf = fval.between(1, np.inf, inclusive=\"neither\").sum()\n",
    "\n",
    "    # Compute statistics: maxFinite,minFinite\n",
    "    finite_vals = fval[np.isfinite(fval)]\n",
    "    maxFinite = finite_vals.loc[finite_vals.idxmax()]\n",
    "    minFinite = finite_vals.loc[finite_vals.idxmin()]\n",
    "\n",
    "    # Compute statistics: maxNormal,minNormal\n",
    "    normal_vals = fval[(df[\"fclass\"] == FloatClass.NORMAL) & (fval > 0)]\n",
    "    maxNormal = normal_vals.loc[normal_vals.idxmax()] if normal_vals.any() else np.nan\n",
    "    minNormal = normal_vals.loc[normal_vals.idxmin()] if normal_vals.any() else np.nan\n",
    "\n",
    "    # Compute statistics: minSubnormal\n",
    "    pos_subnormal = fval[(df[\"fclass\"] == FloatClass.SUBNORMAL) & (fval > 0)]\n",
    "    maxSubnormal = (\n",
    "        pos_subnormal.loc[pos_subnormal.idxmax()] if pos_subnormal.any() else np.nan\n",
    "    )\n",
    "    minSubnormal = (\n",
    "        pos_subnormal.loc[pos_subnormal.idxmin()] if pos_subnormal.any() else np.nan\n",
    "    )\n",
    "\n",
    "    # Compute roundtrips: rt16, rt32\n",
    "    with np.errstate(over=\"ignore\"):\n",
    "        rt16 = (np.float64(np.float16(fval)) == np.float64(fval)) | ~np.isfinite(fval)\n",
    "        rt32 = (np.float64(np.float32(fval)) == np.float64(fval)) | ~np.isfinite(fval)\n",
    "\n",
    "    rt16 = rt16.all()\n",
    "    rt32 = rt32.all()\n",
    "    assert rt32  # If not, we should include rt32 in the table\n",
    "\n",
    "    # Assemble tuple\n",
    "    return dict(\n",
    "        name=fi.name,\n",
    "        B=fi.bits,\n",
    "        P=fi.precision,\n",
    "        E=E,\n",
    "        T=S,\n",
    "        lt1=total_01,\n",
    "        gt1=total_1Inf,\n",
    "        rt16=rt16,\n",
    "        maxFinite=maxFinite,\n",
    "        minFinite=minFinite,\n",
    "        maxNormal=maxNormal,\n",
    "        minNormal=minNormal,\n",
    "        minSubnormal=minSubnormal,\n",
    "        maxSubnormal=maxSubnormal,\n",
    "    )\n",
    "\n",
    "\n",
    "formats_to_check = (\n",
    "    tiny_formats\n",
    "    + fp8_formats\n",
    "    + [format_info_bfloat16, format_info_ocp_int8, format_info_ocp_e8m0]\n",
    ")\n",
    "stats = [collect_stats(fi) for fi in formats_to_check]\n",
    "df = pandas.DataFrame(stats)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Emit HTML table"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style type=\"text/css\">\n",
       "</style>\n",
       "<table id=\"T_6e950\">\n",
       "  <thead>\n",
       "    <tr>\n",
       "      <th id=\"T_6e950_level0_col0\" class=\"col_heading level0 col0\" >name</th>\n",
       "      <th id=\"T_6e950_level0_col1\" class=\"col_heading level0 col1\" >B</th>\n",
       "      <th id=\"T_6e950_level0_col2\" class=\"col_heading level0 col2\" >P</th>\n",
       "      <th id=\"T_6e950_level0_col3\" class=\"col_heading level0 col3\" >E</th>\n",
       "      <th id=\"T_6e950_level0_col4\" class=\"col_heading level0 col4\" >T</th>\n",
       "      <th id=\"T_6e950_level0_col5\" class=\"col_heading level0 col5\" >lt1</th>\n",
       "      <th id=\"T_6e950_level0_col6\" class=\"col_heading level0 col6\" >gt1</th>\n",
       "      <th id=\"T_6e950_level0_col7\" class=\"col_heading level0 col7\" >rt16</th>\n",
       "      <th id=\"T_6e950_level0_col8\" class=\"col_heading level0 col8\" >maxFinite</th>\n",
       "      <th id=\"T_6e950_level0_col9\" class=\"col_heading level0 col9\" >minFinite</th>\n",
       "      <th id=\"T_6e950_level0_col10\" class=\"col_heading level0 col10\" >maxNormal</th>\n",
       "      <th id=\"T_6e950_level0_col11\" class=\"col_heading level0 col11\" >minNormal</th>\n",
       "      <th id=\"T_6e950_level0_col12\" class=\"col_heading level0 col12\" >minSubnormal</th>\n",
       "      <th id=\"T_6e950_level0_col13\" class=\"col_heading level0 col13\" >maxSubnormal</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row0_col0\" class=\"data row0 col0\" >ocp_e2m1</td>\n",
       "      <td id=\"T_6e950_row0_col1\" class=\"data row0 col1\" >4</td>\n",
       "      <td id=\"T_6e950_row0_col2\" class=\"data row0 col2\" >2</td>\n",
       "      <td id=\"T_6e950_row0_col3\" class=\"data row0 col3\" >2</td>\n",
       "      <td id=\"T_6e950_row0_col4\" class=\"data row0 col4\" >1</td>\n",
       "      <td id=\"T_6e950_row0_col5\" class=\"data row0 col5\" >1</td>\n",
       "      <td id=\"T_6e950_row0_col6\" class=\"data row0 col6\" >5</td>\n",
       "      <td id=\"T_6e950_row0_col7\" class=\"data row0 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row0_col8\" class=\"data row0 col8\" >       6</td>\n",
       "      <td id=\"T_6e950_row0_col9\" class=\"data row0 col9\" >      -6</td>\n",
       "      <td id=\"T_6e950_row0_col10\" class=\"data row0 col10\" >       6</td>\n",
       "      <td id=\"T_6e950_row0_col11\" class=\"data row0 col11\" >       1</td>\n",
       "      <td id=\"T_6e950_row0_col12\" class=\"data row0 col12\" >     0.5</td>\n",
       "      <td id=\"T_6e950_row0_col13\" class=\"data row0 col13\" >     0.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row1_col0\" class=\"data row1 col0\" >ocp_e2m3</td>\n",
       "      <td id=\"T_6e950_row1_col1\" class=\"data row1 col1\" >6</td>\n",
       "      <td id=\"T_6e950_row1_col2\" class=\"data row1 col2\" >4</td>\n",
       "      <td id=\"T_6e950_row1_col3\" class=\"data row1 col3\" >2</td>\n",
       "      <td id=\"T_6e950_row1_col4\" class=\"data row1 col4\" >3</td>\n",
       "      <td id=\"T_6e950_row1_col5\" class=\"data row1 col5\" >7</td>\n",
       "      <td id=\"T_6e950_row1_col6\" class=\"data row1 col6\" >23</td>\n",
       "      <td id=\"T_6e950_row1_col7\" class=\"data row1 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row1_col8\" class=\"data row1 col8\" >     7.5</td>\n",
       "      <td id=\"T_6e950_row1_col9\" class=\"data row1 col9\" >    -7.5</td>\n",
       "      <td id=\"T_6e950_row1_col10\" class=\"data row1 col10\" >     7.5</td>\n",
       "      <td id=\"T_6e950_row1_col11\" class=\"data row1 col11\" >       1</td>\n",
       "      <td id=\"T_6e950_row1_col12\" class=\"data row1 col12\" >   0.125</td>\n",
       "      <td id=\"T_6e950_row1_col13\" class=\"data row1 col13\" >   0.875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row2_col0\" class=\"data row2 col0\" >ocp_e3m2</td>\n",
       "      <td id=\"T_6e950_row2_col1\" class=\"data row2 col1\" >6</td>\n",
       "      <td id=\"T_6e950_row2_col2\" class=\"data row2 col2\" >3</td>\n",
       "      <td id=\"T_6e950_row2_col3\" class=\"data row2 col3\" >3</td>\n",
       "      <td id=\"T_6e950_row2_col4\" class=\"data row2 col4\" >2</td>\n",
       "      <td id=\"T_6e950_row2_col5\" class=\"data row2 col5\" >11</td>\n",
       "      <td id=\"T_6e950_row2_col6\" class=\"data row2 col6\" >19</td>\n",
       "      <td id=\"T_6e950_row2_col7\" class=\"data row2 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row2_col8\" class=\"data row2 col8\" >      28</td>\n",
       "      <td id=\"T_6e950_row2_col9\" class=\"data row2 col9\" >     -28</td>\n",
       "      <td id=\"T_6e950_row2_col10\" class=\"data row2 col10\" >      28</td>\n",
       "      <td id=\"T_6e950_row2_col11\" class=\"data row2 col11\" >    0.25</td>\n",
       "      <td id=\"T_6e950_row2_col12\" class=\"data row2 col12\" >  0.0625</td>\n",
       "      <td id=\"T_6e950_row2_col13\" class=\"data row2 col13\" >  0.1875</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row3_col0\" class=\"data row3 col0\" >ocp_e4m3</td>\n",
       "      <td id=\"T_6e950_row3_col1\" class=\"data row3 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row3_col2\" class=\"data row3 col2\" >4</td>\n",
       "      <td id=\"T_6e950_row3_col3\" class=\"data row3 col3\" >4</td>\n",
       "      <td id=\"T_6e950_row3_col4\" class=\"data row3 col4\" >3</td>\n",
       "      <td id=\"T_6e950_row3_col5\" class=\"data row3 col5\" >55</td>\n",
       "      <td id=\"T_6e950_row3_col6\" class=\"data row3 col6\" >70</td>\n",
       "      <td id=\"T_6e950_row3_col7\" class=\"data row3 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row3_col8\" class=\"data row3 col8\" >     448</td>\n",
       "      <td id=\"T_6e950_row3_col9\" class=\"data row3 col9\" >    -448</td>\n",
       "      <td id=\"T_6e950_row3_col10\" class=\"data row3 col10\" >     448</td>\n",
       "      <td id=\"T_6e950_row3_col11\" class=\"data row3 col11\" >0.015625</td>\n",
       "      <td id=\"T_6e950_row3_col12\" class=\"data row3 col12\" >1*2^-9</td>\n",
       "      <td id=\"T_6e950_row3_col13\" class=\"data row3 col13\" >7/4*2^-7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row4_col0\" class=\"data row4 col0\" >ocp_e5m2</td>\n",
       "      <td id=\"T_6e950_row4_col1\" class=\"data row4 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row4_col2\" class=\"data row4 col2\" >3</td>\n",
       "      <td id=\"T_6e950_row4_col3\" class=\"data row4 col3\" >5</td>\n",
       "      <td id=\"T_6e950_row4_col4\" class=\"data row4 col4\" >2</td>\n",
       "      <td id=\"T_6e950_row4_col5\" class=\"data row4 col5\" >59</td>\n",
       "      <td id=\"T_6e950_row4_col6\" class=\"data row4 col6\" >63</td>\n",
       "      <td id=\"T_6e950_row4_col7\" class=\"data row4 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row4_col8\" class=\"data row4 col8\" >   57344</td>\n",
       "      <td id=\"T_6e950_row4_col9\" class=\"data row4 col9\" >  -57344</td>\n",
       "      <td id=\"T_6e950_row4_col10\" class=\"data row4 col10\" >   57344</td>\n",
       "      <td id=\"T_6e950_row4_col11\" class=\"data row4 col11\" >1*2^-14</td>\n",
       "      <td id=\"T_6e950_row4_col12\" class=\"data row4 col12\" >1*2^-16</td>\n",
       "      <td id=\"T_6e950_row4_col13\" class=\"data row4 col13\" >3/2*2^-15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row5_col0\" class=\"data row5 col0\" >p3109_p1</td>\n",
       "      <td id=\"T_6e950_row5_col1\" class=\"data row5 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row5_col2\" class=\"data row5 col2\" >1</td>\n",
       "      <td id=\"T_6e950_row5_col3\" class=\"data row5 col3\" >7</td>\n",
       "      <td id=\"T_6e950_row5_col4\" class=\"data row5 col4\" >0</td>\n",
       "      <td id=\"T_6e950_row5_col5\" class=\"data row5 col5\" >62</td>\n",
       "      <td id=\"T_6e950_row5_col6\" class=\"data row5 col6\" >63</td>\n",
       "      <td id=\"T_6e950_row5_col7\" class=\"data row5 col7\" >False</td>\n",
       "      <td id=\"T_6e950_row5_col8\" class=\"data row5 col8\" >1*2^63</td>\n",
       "      <td id=\"T_6e950_row5_col9\" class=\"data row5 col9\" >-1*2^63</td>\n",
       "      <td id=\"T_6e950_row5_col10\" class=\"data row5 col10\" >1*2^63</td>\n",
       "      <td id=\"T_6e950_row5_col11\" class=\"data row5 col11\" >1*2^-62</td>\n",
       "      <td id=\"T_6e950_row5_col12\" class=\"data row5 col12\" >nan</td>\n",
       "      <td id=\"T_6e950_row5_col13\" class=\"data row5 col13\" >nan</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row6_col0\" class=\"data row6 col0\" >p3109_p2</td>\n",
       "      <td id=\"T_6e950_row6_col1\" class=\"data row6 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row6_col2\" class=\"data row6 col2\" >2</td>\n",
       "      <td id=\"T_6e950_row6_col3\" class=\"data row6 col3\" >6</td>\n",
       "      <td id=\"T_6e950_row6_col4\" class=\"data row6 col4\" >1</td>\n",
       "      <td id=\"T_6e950_row6_col5\" class=\"data row6 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row6_col6\" class=\"data row6 col6\" >62</td>\n",
       "      <td id=\"T_6e950_row6_col7\" class=\"data row6 col7\" >False</td>\n",
       "      <td id=\"T_6e950_row6_col8\" class=\"data row6 col8\" >1*2^31</td>\n",
       "      <td id=\"T_6e950_row6_col9\" class=\"data row6 col9\" >-1*2^31</td>\n",
       "      <td id=\"T_6e950_row6_col10\" class=\"data row6 col10\" >1*2^31</td>\n",
       "      <td id=\"T_6e950_row6_col11\" class=\"data row6 col11\" >1*2^-31</td>\n",
       "      <td id=\"T_6e950_row6_col12\" class=\"data row6 col12\" >1*2^-32</td>\n",
       "      <td id=\"T_6e950_row6_col13\" class=\"data row6 col13\" >1*2^-32</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row7_col0\" class=\"data row7 col0\" >p3109_p3</td>\n",
       "      <td id=\"T_6e950_row7_col1\" class=\"data row7 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row7_col2\" class=\"data row7 col2\" >3</td>\n",
       "      <td id=\"T_6e950_row7_col3\" class=\"data row7 col3\" >5</td>\n",
       "      <td id=\"T_6e950_row7_col4\" class=\"data row7 col4\" >2</td>\n",
       "      <td id=\"T_6e950_row7_col5\" class=\"data row7 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row7_col6\" class=\"data row7 col6\" >62</td>\n",
       "      <td id=\"T_6e950_row7_col7\" class=\"data row7 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row7_col8\" class=\"data row7 col8\" >   49152</td>\n",
       "      <td id=\"T_6e950_row7_col9\" class=\"data row7 col9\" >  -49152</td>\n",
       "      <td id=\"T_6e950_row7_col10\" class=\"data row7 col10\" >   49152</td>\n",
       "      <td id=\"T_6e950_row7_col11\" class=\"data row7 col11\" >1*2^-15</td>\n",
       "      <td id=\"T_6e950_row7_col12\" class=\"data row7 col12\" >1*2^-17</td>\n",
       "      <td id=\"T_6e950_row7_col13\" class=\"data row7 col13\" >3/2*2^-16</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row8_col0\" class=\"data row8 col0\" >p3109_p4</td>\n",
       "      <td id=\"T_6e950_row8_col1\" class=\"data row8 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row8_col2\" class=\"data row8 col2\" >4</td>\n",
       "      <td id=\"T_6e950_row8_col3\" class=\"data row8 col3\" >4</td>\n",
       "      <td id=\"T_6e950_row8_col4\" class=\"data row8 col4\" >3</td>\n",
       "      <td id=\"T_6e950_row8_col5\" class=\"data row8 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row8_col6\" class=\"data row8 col6\" >62</td>\n",
       "      <td id=\"T_6e950_row8_col7\" class=\"data row8 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row8_col8\" class=\"data row8 col8\" >     224</td>\n",
       "      <td id=\"T_6e950_row8_col9\" class=\"data row8 col9\" >    -224</td>\n",
       "      <td id=\"T_6e950_row8_col10\" class=\"data row8 col10\" >     224</td>\n",
       "      <td id=\"T_6e950_row8_col11\" class=\"data row8 col11\" >0.0078125</td>\n",
       "      <td id=\"T_6e950_row8_col12\" class=\"data row8 col12\" >1*2^-10</td>\n",
       "      <td id=\"T_6e950_row8_col13\" class=\"data row8 col13\" >7/4*2^-8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row9_col0\" class=\"data row9 col0\" >p3109_p5</td>\n",
       "      <td id=\"T_6e950_row9_col1\" class=\"data row9 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row9_col2\" class=\"data row9 col2\" >5</td>\n",
       "      <td id=\"T_6e950_row9_col3\" class=\"data row9 col3\" >3</td>\n",
       "      <td id=\"T_6e950_row9_col4\" class=\"data row9 col4\" >4</td>\n",
       "      <td id=\"T_6e950_row9_col5\" class=\"data row9 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row9_col6\" class=\"data row9 col6\" >62</td>\n",
       "      <td id=\"T_6e950_row9_col7\" class=\"data row9 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row9_col8\" class=\"data row9 col8\" >      15</td>\n",
       "      <td id=\"T_6e950_row9_col9\" class=\"data row9 col9\" >     -15</td>\n",
       "      <td id=\"T_6e950_row9_col10\" class=\"data row9 col10\" >      15</td>\n",
       "      <td id=\"T_6e950_row9_col11\" class=\"data row9 col11\" >   0.125</td>\n",
       "      <td id=\"T_6e950_row9_col12\" class=\"data row9 col12\" >0.0078125</td>\n",
       "      <td id=\"T_6e950_row9_col13\" class=\"data row9 col13\" >15/8*2^-4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row10_col0\" class=\"data row10 col0\" >p3109_p6</td>\n",
       "      <td id=\"T_6e950_row10_col1\" class=\"data row10 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row10_col2\" class=\"data row10 col2\" >6</td>\n",
       "      <td id=\"T_6e950_row10_col3\" class=\"data row10 col3\" >2</td>\n",
       "      <td id=\"T_6e950_row10_col4\" class=\"data row10 col4\" >5</td>\n",
       "      <td id=\"T_6e950_row10_col5\" class=\"data row10 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row10_col6\" class=\"data row10 col6\" >62</td>\n",
       "      <td id=\"T_6e950_row10_col7\" class=\"data row10 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row10_col8\" class=\"data row10 col8\" >   3.875</td>\n",
       "      <td id=\"T_6e950_row10_col9\" class=\"data row10 col9\" >  -3.875</td>\n",
       "      <td id=\"T_6e950_row10_col10\" class=\"data row10 col10\" >   3.875</td>\n",
       "      <td id=\"T_6e950_row10_col11\" class=\"data row10 col11\" >     0.5</td>\n",
       "      <td id=\"T_6e950_row10_col12\" class=\"data row10 col12\" >0.015625</td>\n",
       "      <td id=\"T_6e950_row10_col13\" class=\"data row10 col13\" >31/16*2^-2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row11_col0\" class=\"data row11 col0\" >bfloat16</td>\n",
       "      <td id=\"T_6e950_row11_col1\" class=\"data row11 col1\" >16</td>\n",
       "      <td id=\"T_6e950_row11_col2\" class=\"data row11 col2\" >8</td>\n",
       "      <td id=\"T_6e950_row11_col3\" class=\"data row11 col3\" >8</td>\n",
       "      <td id=\"T_6e950_row11_col4\" class=\"data row11 col4\" >7</td>\n",
       "      <td id=\"T_6e950_row11_col5\" class=\"data row11 col5\" >16255</td>\n",
       "      <td id=\"T_6e950_row11_col6\" class=\"data row11 col6\" >16383</td>\n",
       "      <td id=\"T_6e950_row11_col7\" class=\"data row11 col7\" >False</td>\n",
       "      <td id=\"T_6e950_row11_col8\" class=\"data row11 col8\" >255/128*2^127</td>\n",
       "      <td id=\"T_6e950_row11_col9\" class=\"data row11 col9\" >-255/128*2^127</td>\n",
       "      <td id=\"T_6e950_row11_col10\" class=\"data row11 col10\" >255/128*2^127</td>\n",
       "      <td id=\"T_6e950_row11_col11\" class=\"data row11 col11\" >1*2^-126</td>\n",
       "      <td id=\"T_6e950_row11_col12\" class=\"data row11 col12\" >1*2^-133</td>\n",
       "      <td id=\"T_6e950_row11_col13\" class=\"data row11 col13\" >127/64*2^-127</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row12_col0\" class=\"data row12 col0\" >ocp_int8</td>\n",
       "      <td id=\"T_6e950_row12_col1\" class=\"data row12 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row12_col2\" class=\"data row12 col2\" >8</td>\n",
       "      <td id=\"T_6e950_row12_col3\" class=\"data row12 col3\" >0</td>\n",
       "      <td id=\"T_6e950_row12_col4\" class=\"data row12 col4\" >7</td>\n",
       "      <td id=\"T_6e950_row12_col5\" class=\"data row12 col5\" >63</td>\n",
       "      <td id=\"T_6e950_row12_col6\" class=\"data row12 col6\" >63</td>\n",
       "      <td id=\"T_6e950_row12_col7\" class=\"data row12 col7\" >True</td>\n",
       "      <td id=\"T_6e950_row12_col8\" class=\"data row12 col8\" >127/64*2^0</td>\n",
       "      <td id=\"T_6e950_row12_col9\" class=\"data row12 col9\" >      -2</td>\n",
       "      <td id=\"T_6e950_row12_col10\" class=\"data row12 col10\" >nan</td>\n",
       "      <td id=\"T_6e950_row12_col11\" class=\"data row12 col11\" >nan</td>\n",
       "      <td id=\"T_6e950_row12_col12\" class=\"data row12 col12\" >0.015625</td>\n",
       "      <td id=\"T_6e950_row12_col13\" class=\"data row12 col13\" >127/64*2^0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td id=\"T_6e950_row13_col0\" class=\"data row13 col0\" >ocp_e8m0</td>\n",
       "      <td id=\"T_6e950_row13_col1\" class=\"data row13 col1\" >8</td>\n",
       "      <td id=\"T_6e950_row13_col2\" class=\"data row13 col2\" >1</td>\n",
       "      <td id=\"T_6e950_row13_col3\" class=\"data row13 col3\" >8</td>\n",
       "      <td id=\"T_6e950_row13_col4\" class=\"data row13 col4\" >0</td>\n",
       "      <td id=\"T_6e950_row13_col5\" class=\"data row13 col5\" >127</td>\n",
       "      <td id=\"T_6e950_row13_col6\" class=\"data row13 col6\" >127</td>\n",
       "      <td id=\"T_6e950_row13_col7\" class=\"data row13 col7\" >False</td>\n",
       "      <td id=\"T_6e950_row13_col8\" class=\"data row13 col8\" >1*2^127</td>\n",
       "      <td id=\"T_6e950_row13_col9\" class=\"data row13 col9\" >1*2^-127</td>\n",
       "      <td id=\"T_6e950_row13_col10\" class=\"data row13 col10\" >1*2^127</td>\n",
       "      <td id=\"T_6e950_row13_col11\" class=\"data row13 col11\" >1*2^-127</td>\n",
       "      <td id=\"T_6e950_row13_col12\" class=\"data row13 col12\" >nan</td>\n",
       "      <td id=\"T_6e950_row13_col13\" class=\"data row13 col13\" >nan</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Special rendering for float values - if they don't render nicely in 10.5g,\n",
    "# use float_pow2str\n",
    "def render_float(v):\n",
    "    s = f\"{v:8.5g}\"\n",
    "    if not \"e\" in s and float(s) == v:\n",
    "        return s\n",
    "    else:\n",
    "        return float_pow2str(v)\n",
    "\n",
    "\n",
    "for field in (\n",
    "    \"maxFinite\",\n",
    "    \"minFinite\",\n",
    "    \"maxNormal\",\n",
    "    \"minNormal\",\n",
    "    \"minSubnormal\",\n",
    "    \"maxSubnormal\",\n",
    "):\n",
    "    df[field] = df[field].map(render_float)\n",
    "\n",
    "\n",
    "HTML(df.style.hide().to_html())"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "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
}
