浮点数密度 - 数量的大小

时间:2011-08-10 06:02:01

标签: c++ floating-point

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

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

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

4 个答案:

答案 0 :(得分:7)

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

IEEE 754, binary-32 number format

基本上它有三个部分:

  • 代表符号的1位float32_sign
  • 23位float32_fraction[]表示二元分数系数
  • 8位float32_exp重新表示整数指数为2

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

获取实际数字的公式为:

IEEE 754, binary-32 number formula

忘记指数,小数部分可以准确地表示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

因此,如果指数为1(float32_exp = 128),我们将在(1,2)(-1,-2)之间有8388608个数字。

但是对于大数字,例如当指数为126(float32_exp = 253)时,我们仍然只有8388608个数字来表示(2^126), 2^127)(-2^126, -2^127)之间的差距。

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

enter image description here

图形在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)

答案 1 :(得分:2)

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

换句话说,浮点数只有尾数的固定位数,随着数字变大,这些manitssa数字将在小数点后面更少(这是什么我想你在问。)

替代方案是定点数字,其中小数点后的位数是常数。但是没有多少系统使用固定点数,所以如果这就是你想要的,你必须自己动手,或者使用第三方库。

答案 2 :(得分:1)

来自What Every Computer Scientist Should Know About Floating-Point Arithmetic

  

通常,浮点数将表示为±d.dd ... d   ×e,其中d.dd ... d称为有效数,有p位数。更多   恰好是±d0。 d1 d2 ... dp-1×e代表数字。

因此,答案是肯定的,因为尾数(有效数字的旧词)具有固定的位数。

答案 3 :(得分:1)

浮点数是尾数和指数的二进制表示。对于IEEE 754 short real,最流行的32位表示,有一个符号位,尾数为23 + 1位,指数范围为-126到+127,功率为2。

所以,要解决你的观点:

  1. 对数字进行编码的位数是常量。 32位浮点数约为7位小数,64位浮点数约为16位。

  2. 见1.

  3. 是的。