整数算术加法和减法在什么范围内精确到IEEE双精度浮点的整数?

Ben*_*Ben 4 floating-point

根据维基百科的IEEE 64位浮点标准:

在2 52 = 4,503,599,627,370,496和2 53 = 9,007,199,254,740,992之间,可表示的数字正好是整数.对于下一个范围,从2 53到2 54,所有内容都乘以2,因此可表示的数字是偶数,等等.

这是否意味着连续的整数最多可以表示为2 53

总之,我试图找到整数值的范围,整数加法和减法操作将导致完全正确的结果.

Eri*_*hil 7

是的,从-2 53到+2 53的所有整数都包含在IEEE-754 64位浮点中.符合IEEE 754的实现会返回完全正确的结果,所有操作a+ba-b地方a,b以及数学结果在该区间的整数.

显然,某些结果将在该区间之外,例如2 53 +1,因此产生此类结果的许多操作将产生由于四舍五入到可表示值而不准确的值.

的间隔,使得ab是整数在间隔保证a+ba-b是确切是-2 52到2 52,包括端值.

  • @Ben:在JavaScript中,像`<<`这样的按位运算符只能运行32位整数.JavaScript并非旨在成为具有强类型的语言.它具有灵活的Number格式,包括一些浮点和一些整数语义.在`<<`操作中,左操作数从一般数字转换为32位整数,然后以32位整数格式执行移位. (4认同)
  • @Ben:`2e53`不是5的幂.它是53的幂的2倍10,所以它是2*10**53,这超出了所有整数可表示的区间.2e53-5不可代表. (3认同)
  • @Ben:JavaScript没有提供在浮点中指定这些值的好方法.C有一个十六进制浮点表示法,其中2**53为"0x1p53".在JavaScript中,你可以使用`Math.pow(2,53)`,但是`pow`是一个难以实现的函数,我不会依赖于正确计算`Math.pow(2,53)`的实现,尽管一个好的实施应该.可以肯定的是,你可以准备2**53作为`(1 << 26)*(1 << 27)`. (2认同)
  • @Ben:我已经编程超过三分之一世纪,为了它上学,有一些具有挑战性的工作,并偶尔得到教育不正确地回答StackOverflow问题.阅读有助于特别理解理论来自教科书和学术论文,权威知识来自官方标准(例如,JavaScript应遵循[ECMA-262标准](http://www.ecma-international.org/publications/standards) /Ecma-262.htm))和软件生产者制作的软件文档,而不是第三方网页. (2认同)