迷你浮點數

迷你浮點（minifloat）是用较少位元的浮點數值。这种低精度不適合通用數值計算，通常用於特殊目的，例如：

计算机图形学，因为人类对颜色和光照强度的感知精度较低。16位半精度格式非常流行。
機器學習，它对数值精度相对不敏感。16位、8位甚至4位浮点数的使用越来越广泛，例如bfloat16。https://developer.nvidia.com/blog/nvidia-arm-and-intel-publish-fp8-specification-for-standardization-as-an-interchange-format-for-ai/ (joint announcement by Intel, NVIDIA, Arm); https://arxiv.org/abs/2209.05433 (preprint paper jointly written by researchers from aforementioned 3 companies)

此外，它們經常作為電腦科學課程中的教學工具來展示浮點算術和IEEE 754數字的屬性和結構。Minifloat按照IEEE 754標準設計。必須遵守次正規數和正規數之間邊界規則（未明確寫入的），且具無限大和NaN特殊模式。標準化數字以有偏差的指數儲存。該標準的新修訂版IEEE 754-2008具有16位元二進位小型浮點數。

根据上下文，minifloat可以指小于32位的任何位数，也可以指小于或等于16位的任何位数，或者小于16位的任何位数。微浮点数（microfloat）可以指小于或等于8位的任何位数。

 符號 
迷你浮點通常使用四個數字的元組（S、E、M、B）來描述：
 S是符號欄位的長度。通常為 0 或 1。
 E是指數欄位的長度。
 M是尾數（有效數字）欄位的長度。
 B是指數偏差。

因此，以 (S, E, M, B) 表示的小型浮點格式為 S + E + M 位元。 (S, E, M, B) 表示法可以轉換為 (B, P, L, U) 格式，如 (2, M + 1, B + 1, 2 S − B) (IEEE指數）。

 例子 

+8位元 minifloat 範例(1.4.3) 符號 指數 有效數 0 0 0 0 0 0 0 0

具有1個符號位元、4個指數位元和3個有效位元IEEE half-precision has 5 exponent bits with bias 15 (), IEEE single-precision has 8 exponent bits with bias 127 (), IEEE double-precision has 11 exponent bits with bias 1023 (), and IEEE quadruple-precision has 15 exponent bits with bias 16383 (). See the Exponent bias article for more detail.對於大多數值指數x是。所有IEEE 754原則都應該有效。 

 零的表示 

 0 0000 000 = 0
 1 0000 000 = −0

 次正規數 
有效數用0.擴展：

 0 0000 001 = 0.0012 × 21 - 7 = 0.125 × 2-6 = 0.001953125 (最小次正規數)
 ...
 0 0000 111 = 0.1112 × 21 - 7 = 0.875 × 2-6 = 0.013671875 (最大次正規數)

 標準化數字 

有效數用1.擴展：

 0 0001 000 = 1.0002 × 21 - 7 = 1 × 2-6 = 0.015625 (least normalized number)
 0 0001 001 = 1.0012 × 21 - 7 = 1.125 × 2-6 = 0.017578125
 ...
 0 0111 000 = 1.0002 × 27 - 7 = 1 × 20 = 1
 0 0111 001 = 1.0012 × 27 - 7 = 1.125 × 20 = 1.125 (最小值大於 1)
 ...
 0 1110 000 = 1.0002 × 214 - 7 =  1.000 × 27 =  128
 0 1110 001 = 1.0012 × 214 - 7 =  1.125 × 27 =  144
 ...
 0 1110 110 = 1.1102 × 214 - 7 =  1.750 × 27 = 224
 0 1110 111 = 1.1112 × 214 - 7 =  1.875 × 27 = 240 (最大標準數)

 無窮 

 0 1111 000 = +∞
 1 1111 000 = −∞

 非數 

 s 1111 mmm = NaN (if mmm ≠ 000)

 數值表 

這是此範例 8 位元浮點的所有可能值的圖表。

     … 000         … 001        … 010         … 011       … 100         … 101        … 110         … 111 0 0000 …         0   0.001953125   0.00390625   0.005859375   0.0078125   0.009765625   0.01171875   0.013671875 0 0001 …  0.015625   0.017578125   0.01953125   0.021484375   0.0234375   0.025390625   0.02734375   0.029296875 0 0010 …   0.03125    0.03515625    0.0390625    0.04296875    0.046875    0.05078125    0.0546875    0.05859375 0 0011 …    0.0625     0.0703125     0.078125     0.0859375     0.09375     0.1015625     0.109375     0.1171875 0 0100 …     0.125      0.140625      0.15625      0.171875      0.1875      0.203125      0.21875      0.234375 0 0101 …      0.25       0.28125       0.3125       0.34375       0.375       0.40625       0.4375       0.46875 0 0110 …       0.5        0.5625        0.625        0.6875        0.75        0.8125        0.875        0.9375 0 0111 …         1         1.125         1.25         1.375         1.5         1.625         1.75         1.875 0 1000 …         2          2.25          2.5          2.75           3          3.25          3.5          3.75 0 1001 …         4           4.5            5           5.5           6           6.5            7           7.5 0 1010 …         8             9           10            11          12            13           14            15 0 1011 …        16            18           20            22          24            26           28            30 0 1100 …        32            36           40            44          48            52           56            60 0 1101 …        64            72           80            88          96           104          112           120 0 1110 …       128           144          160           176         192           208          224           240 0 1111 …      ∞          NaN          NaN           NaN         NaN           NaN          NaN           NaN 1 0000 …        −0  −0.001953125  −0.00390625  −0.005859375  −0.0078125  −0.009765625  −0.01171875  −0.013671875 1 0001 … −0.015625  −0.017578125  −0.01953125  −0.021484375  −0.0234375  −0.025390625  −0.02734375  −0.029296875 1 0010 …  −0.03125   −0.03515625   −0.0390625   −0.04296875   −0.046875   −0.05078125   −0.0546875   −0.05859375 1 0011 …   −0.0625    −0.0703125    −0.078125    −0.0859375    −0.09375    −0.1015625    −0.109375    −0.1171875 1 0100 …    −0.125     −0.140625     −0.15625     −0.171875     −0.1875     −0.203125     −0.21875     −0.234375 1 0101 …     −0.25      −0.28125      −0.3125      −0.34375      −0.375      −0.40625      −0.4375      −0.46875 1 0110 …      −0.5       −0.5625       −0.625       −0.6875       −0.75       −0.8125       −0.875       −0.9375 1 0111 …        −1        −1.125        −1.25        −1.375        −1.5        −1.625        −1.75        −1.875 1 1000 …        −2         −2.25         −2.5         −2.75          −3         −3.25         −3.5         −3.75 1 1001 …        −4          −4.5           −5          −5.5          −6          −6.5           −7          −7.5 1 1010 …        −8            −9          −10           −11         −12           −13          −14           −15 1 1011 …       −16           −18          −20           −22         −24           −26          −28           −30 1 1100 …       −32           −36          −40           −44         −48           −52          −56           −60 1 1101 …       −64           −72          −80           −88         −96          −104         −112          −120 1 1110 …      −128          −144         −160          −176        −192          −208         −224          −240 1 1111 …     −∞          NaN          NaN           NaN         NaN           NaN          NaN           NaN

只有 242 個不同的非 NaN 值（如果 +0 和 -0 視為不同），因為 14 個位元模式代表 NaN。

可以使用腳本為 SEMB 值的任意組合產生如上所述的表格Python 或GDScript.

 其它偏差值 

在這些小尺寸下，其它偏差值可能會很有趣，例如 -2 的偏差將使數字 0-16 具有與整數 0-16 相同的位表示形式，但會導致無法表示非整數值。

 0 0000 000 = 0.0002 × 21 - (-2) = 0.0 × 23 = 0 (subnormal number)
 0 0000 001 = 0.0012 × 21 - (-2) = 0.125 × 23 = 1 (subnormal number)
 0 0000 111 = 0.1112 × 21 - (-2) = 0.875 × 23 = 7 (subnormal number)
 0 0001 000 = 1.0002 × 21 - (-2) = 1.000 × 23 = 8 (normalized number)
 0 0001 111 = 1.1112 × 21 - (-2) = 1.875 × 23 = 15 (normalized number)
 0 0010 000 = 1.0002 × 22 - (-2) = 1.000 × 24 = 16 (normalized number)

 Arithmetic 
 Addition 


此圖示範了增加較小的 (1.3.2.3)-6 位元迷你浮點。

此浮點系統完全遵循IEEE 754規則。 

NaN作為運算元始終產生NaN結果。

∞−∞和 (−∞) +∞會產生 NaN（綠）。∞可以按有限值增減而不會發生變化。

有限操作數的和可以給出無限結果（即 14.0 + 3.0 = +∞，因為結果是青，-∞紅）。

算術運算可以類似地說明：

 Other sizes 

The Radeon R300 and R420 GPUs used an "fp24" floating-point format with 7 bits of exponent and 16 bits (+1 implicit) of mantissa..
"Full Precision" in Direct3D 9.0 is a proprietary 24-bit floating-point format. Microsoft's D3D9 (Shader Model 2.0) graphics API initially supported both FP24 (as in ATI's R300 chip) and FP32 (as in Nvidia's NV30 chip) as "Full Precision", as well as FP16 as "Partial Precision" for vertex and pixel shader calculations performed by the graphics hardware.

Khronos defines 10-bit and 11-bit float formats for use with Vulkan. Both formats have no sign bit and a 5-bit exponent. The 10-bit format has a 5-bit mantissa, and the 11-bit format has a 6-bit mantissa.

 4 bits and fewer 

The smallest possible float size that follows all IEEE principles, including normalized numbers, subnormal numbers, signed zero, signed infinity, and multiple NaN values, is a 4-bit float with 1-bit sign, 2-bit exponent, and 1-bit mantissa. In the table below, the columns have different values for the sign and mantissa bits, and the rows are different values for the exponent bits.

 0 … 0  0 … 1  1 … 0  1 … 1 … 00 …     0    0.5     −0   −0.5 … 01 …     1    1.5     −1   −1.5 … 10 …     2      3     −2     −3 … 11 …  ∞   NaN  −∞   NaN

If normalized numbers are not required, the size can be reduced to 3-bit by reducing the exponent down to 1.

 0 … 0  0 … 1  1 … 0  1 … 1 … 0 …     0      1     −0     −1 … 1 …  ∞   NaN  −∞   NaN

In situations where the sign bit can be excluded, each of the above examples can be reduced by 1 bit further, keeping only the left half of the above tables. A 2-bit float with 1-bit exponent and 1-bit mantissa would only have 0, 1, Inf, NaN values.

If the mantissa is allowed to be 0-bit, a 1-bit float format would have a 1-bit exponent, and the only two values would be 0 and Inf. The exponent must be at least 1 bit or else it no longer makes sense as a float (it would just be a signed number).

 In embedded devices 
Minifloats are also commonly used in embedded devices, especially on microcontrollers where floating-point will need to be emulated in software. To speed up the computation, the mantissa typically occupies exactly half of the bits, so the register boundary automatically addresses the parts without shifting.

 	參見 
 定點數運算
 半精度浮点数
 G.711 A-Law

 參考 

 外部連結 
 OpenGL half float pixel

Category:Floating point types
Category:計算機算術