在二进制浮点中可以表示哪些类型的数字?

Nie*_*sol 21 language-agnostic math floating-point

我已经阅读了很多关于花车的内容,但这些都是不必要的.我我已经理解了它,但我只想知道一件事:

我知道1/pow(2,n),带有n整数的形式的分数可以用浮点数精确表示.这意味着,如果我自己增加1/32了3200万次,我会得到确切的结果1,000,000.

什么样的1/(32+16)?它是两个两个幂之和的一个,这有用吗?或者它1/32+1/16有效吗?这是我很困惑的地方,所以如果有人能为我澄清这一点我会很感激.

Mys*_*ial 29

规则可以概括为:

  • 如果分母的素数分解仅包含2,则数字可以精确地用二进制表示.(分母是2的幂)

所以1/(32 + 16)在二进制中是不可表示的,因为它在分母中的因子为3.但是1/32 + 1/16 = 3/32.

也就是说,在浮点类型中可以表示更多限制.例如,IEEE中只有53位尾数,double因此1/2 + 1/2^500无法表示.

因此,只要指数的范围不超过53个幂,你就可以做到两个幂的总和.


将此概括为其他基础:

  • 如果分母的素数分解仅由2和5组成,则数字可以在基数10中精确表示.

  • 如果分母的素数因子化仅包含在因式分解中找到的素数,则有理数X可以在基数中精确表示.NXN

  • 所以,如果我有这个权利,我可以使用任何数字`X/Y`,只要`Y`是2的幂,而'X`是一个小于'2 ^ 53`的数字? (4认同)
  • @ legends2k 24/48可以减少.在尝试应用上述规则之前,您应该减少分数. (3认同)
  • 对,那是正确的.(除非是上溢/下溢的情况) (2认同)

Eri*_*hil 10

有限数可以用通用IEEE 754双精度格式表示,当且仅当它等于M•2 e时,对于某些整数M和e,使得-2 53 <M <2 53和-1074≤e≤971.

对于单精度,-2 24 <M <2 24和-149≤e≤104.

对于双精度,这些是双精度格式使用52位来存储有效数字(由于隐式1通常具有53位)并使用11位来存储指数的事实的结果.11位编码从0到2047的数字,但0和2047被排除用于特殊目的,并且编码的数字偏向1023,因此它表示从-1022到1023的无偏指数.但是,这些无偏指数用于区间中的有效数字[1,2],这些有效数字有分数.为了将有效数表示为整数,我将指数范围调整为52.单精度相似,23位用于存储24位有效数,8位用于指数,偏差为127.

使用2的幂的整数倍表示可表示的数字而不是更常见的分数有效数,简化了一些数论和其他关于浮点属性的推理.我在这个答案中使用它,因为它允许简洁地表达一组可表示的值.

  • @Kolink:答案本身就是一个单独的句子,它只使用熟悉的整数,乘法,幂和小于(或等于)的概念来准确说明哪些数字可以表示和不能表示.你能得到多少简单?你的整数倍是2的幂,整数和幂必须在一定的范围内.答案的其余部分只是解释句子的来源. (2认同)