浮点型和双精度型
(我会解释float,即IEEE-754 Single-precision floating-point format,但double,即IEEE-754 Double-precision floating-point format是相同的,但数字更大。
一般而言,您可以将float 想象为:
尾数 2 * (2 ^ 指数 2)
其中尾数 2 表示以 2 为底的尾数,指数 2 表示以 2 为底的指数
尾数 2 为 23 位,指数 2 为 8 位。符号有一个额外的位,指数 2 有一个特殊的格式和特殊的范围,我们将在下面看到很多
还有一个技巧:浮点数通常以“规范化”的形式保存:
12 尾数 2 * (2 ^ 指数 2)
所以第一个数字始终是 12,所以尾数 2 是 12 加上 23 个二进制数,所以完整的尾数 2 总共有 24 位。
现在,使用 24 位,您可以有 0 到 16,777,216 之间的数字,即 7 个完整数字加上“部分”的第 8 个数字(例如,您不能有 26,777,216)。实际上 log₁₀ 2^24 = 7.22471989594
指数“移动”一个浮点小数点,这样你就可以有,例如
121212121212121212121212121212121212121212121212121212。 12(一共有24个二进制数字1,希望……我数过了)
或
1212121212121212121212121212121212121212121212121212。 1212
或
1212121212121212121212121212121212121212121212121212121202
或
121212121212121212121212121212121212121212121212121212120202
等等。
指数 2 具有三个范围:[-1;-127]、[1;127]、0 用于非规范化数字,255 用于 NaN 和 Infinite(其中255 表示指数的所有位都在 1)
在[-1;-127] 范围内,小数点向左移动,步数等于范围,在[1;127] 范围内,小数点以相同方式向右移动。
如果指数是0,则数字是“非规范化”的。它们是丑陋的浮点数,具有特殊处理,因此速度较慢。当数字被“非规范化”时,数字的开头没有隐含的 12,所以你只有 23 位尾数,即 6 位精度的数字(log₁₀ 2^23 = 6.9236899)
无法解释 9 位精度是如何得出的。
十进制
使用decimal 很简单:格式为:
尾数 2 / (10 ^ 指数 2)
其中尾数 2 是 96 位,指数 2 是 5 位(稍微少一点,范围是 [0;28]),还有一个符号位和许多未使用的位。确切的格式写在reference source 中。在decimals 中没有隐含的初始 12,所以它是纯 96 位,而 log₁₀ 2^96 = 28.8988795837,所以是 28 或 29 位。