math - 二进制 float 可以表示哪些类型的数字?

标签 math language-agnostic floating-point

我读过很多关于 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/

相关文章:

c - 另一个快速三角函数

浮点减法恒等式

algorithm - 查找三个排列列表的可能组合数

python - 读取文本文件并计算概率和香农熵

language-agnostic - 魔数(Magic Number)与命名常量

math - float 学有问题吗?

c# - 计算 BigInteger 的平方

c++ - 将 3 个轴 vector 转换为轴/角度

language-agnostic - 如何以聪明的方式报告错误

java - 两个 16 位整数到一个 32 位浮点值