Gui*_*e07 3 c++ floating-point
浮点数越多(正面或负面),我们对编码十进制数字的位数越少,这是真的吗?
我们可以在2 1和2 2之间编码更多的十进制数字,而不是在2 16和2 32之间吗?
这两个范围之间的值是否相同?
IEEE 754,二进制32编号规定如下:
基本上它有三个部分:
float32_sign代表标志float32_fraction[]表示二进制分数系数float32_exp重新表示整数指数为2有关详细信息,请参阅wikipedia/Single-precision_floating-point_format.
获得实际数字的公式是:

忘记指数,小数部分可以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)
是的,随着数字变大,可以由浮点数精确表示的数字密度会变小。
换句话说,浮点数的尾数只有固定的位数,并且随着数字变大,小数点后的尾数位数会减少(我认为您要问的是)。
另一种选择是定点数,其中小数点后的位数是恒定的。但是没有多少系统使用定点数,所以如果这是你想要的,你必须自己动手,或者使用第三方库。