浮点数密度 - 数量的大小

Gui*_*e07 3 c++ floating-point

浮点数越多(正面或负面),我们对编码十进制数字的位数越少,这是真的吗?

我们可以在2 1和2 2之间编码更多的十进制数字,而不是在2 16和2 32之间吗?

这两个范围之间的值是否相同?

tin*_*ast 7

IEEE 754,二进制32编号规定如下:

IEEE 754,二进制32数字格式

基本上它有三个部分:

  • 1位float32_sign代表标志
  • 23位float32_fraction[]表示二进制分数系数
  • 8位float32_exp重新表示整数指数为2

有关详细信息,请参阅wikipedia/Single-precision_floating-point_format.

获得实际数字的公式是:

IEEE 754,二进制32数公式

忘记指数,小数部分可以pow(2, 23) = 8388608准确地表示值.此范围内的最大值和最小值为:

    ( 1 + 0, 1 + sum(pow(2, -i)) )  # All co-efficients being 0 and 1 resp. in the above formula
=>  ( 1, 2 - pow(2, -23) )          # By geometric progression
~>  ( 1, 2 )                        # Approximation by upper-bound
Run Code Online (Sandbox Code Playgroud)

因此,对于指数为1(float32_exp = 128),我们将在(1,2)和之间有8388608个数字(-1,-2).

然而,对于大量的,如当指数为126( float32_exp = 253),我们仍然只有8388608号代表之间的差距(2^126), 2^127)(-2^126, -2^127).

1到128之间的分布图如下所示:

在此输入图像描述

图形在0处非常陡峭,绘制它会使它看起来像只有0的单个值.请注意,衰减是指数级的.

获取两个值之间的浮点数的公式为:

def num_floats(begin, end):
    # pow(2, 23) * (log(end, 2) - log(start, 2)) == pow(2, 23) * log(end/start, 2)
    return 8388608 * math.log(float(end)/float(begin), 2)
Run Code Online (Sandbox Code Playgroud)

  • 您能告诉我您是如何得出分布图的吗?我无法解释它。x 轴是什么意思?y 轴似乎是区间 [2^x, 2^x+1) 中的浮点数的数量。非常感谢任何帮助! (2认同)

joh*_*ohn 6

是的,随着数字变大,可以由浮点数精确表示的数字密度会变小。

换句话说,浮点数的尾数只有固定的位数,并且随着数字变大,小数点后的尾数位数会减少(我认为您要问的是)。

另一种选择是定点数,其中小数点后的位数是恒定的。但是没有多少系统使用定点数,所以如果这是你想要的,你必须自己动手,或者使用第三方库。