我读过很多关于 float 的内容,但都是不必要的。我认为我已经基本理解了,但只有一件事我想确定:
我知道,1/pow(2,n)
形式的分数(其中 n
为整数)可以精确地用 float 表示。这意味着,如果我将 1/32
添加到自身 3200 万次,我将恰好得到 1,000,000
。
像 1/(32+16)
这样的东西怎么样?它是 2 的 2 次方之和的 1,这有效吗?或者 1/32+1/16
有效吗?这就是我感到困惑的地方,所以如果有人能为我澄清这一点,我将不胜感激。
最佳答案
规则可以概括为:
- 如果分母的质因数分解仅包含 2(即分母是 2 的幂),则可以用二进制精确表示一个数字。
因此,1/(32 + 16)
无法用二进制表示,因为它的分母是 3。但 1/32 + 1/16 = 3/32
是。
也就是说,用浮点类型表示有更多限制。例如,IEEE double
中只有 53 位尾数,因此 1/2 + 1/2^500
无法表示。
因此,只要指数范围不超过 53 次幂,您就可以进行 2 的幂求和。
<小时/>将此推广到其他基础:
如果分母的质因数分解仅由 2 和 5 组成,则可以精确地以 10 为底表示一个数字。
如果
X
分母的素数分解仅包含素数,则有理数X
可以用基数N
精确表示在N
的分解中找到。
关于math - 二进制 float 可以表示哪些类型的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124936/