浮点数越大(正数或负数),我们对编码十进制数字的位越少,这是真的吗?
我们可以在2 1 和2 2 之间编码更多的十进制数字,而不是2 16 和2 32 之间?
这两个范围之间的值是否相同?
答案 0 :(得分:7)
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
因此,如果指数为1(float32_exp = 128
),我们将在(1,2)
和(-1,-2)
之间有8388608个数字。
但是对于大数字,例如当指数为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)
答案 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。
所以,要解决你的观点:
对数字进行编码的位数是常量。 32位浮点数约为7位小数,64位浮点数约为16位。
见1.
是的。