【问题标题】:Over what range will integer arithmetic addition and subtraction be accurate to the integer in IEEE double precision floating point?整数算术加法和减法在什么范围内将精确到 IEEE 双精度浮点中的整数?
【发布时间】:2014-01-07 14:53:20
【问题描述】:

根据Wikipedia on the IEEE 64-bit floating point standard

在 252=4,503,599,627,370,496 和 253=9,007,199,254,740,992 之间 可表示的数字正是整数。对于下一个范围, 从 253 到 254,一切都乘以 2,所以可表示 数字是偶数等。

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

简而言之,我试图找到整数值的范围,在该范围内整数加法和减法运算将产生完全正确的结果。

【问题讨论】:

    标签: floating-point


    【解决方案1】:

    是的,从 -253 到 +253 的所有整数都可以用 IEEE-754 64 位浮点数表示。符合 IEEE 754 的实现将为 a+ba-b 的所有操作返回完全正确的结果,其中 ab,并且数学结果是该区间内的整数。

    显然,某些结果将超出该区间,例如 253+1,因此产生此类结果的许多操作将产生一个不精确的值,因为四舍五入到可表示的值。

    ab 是区间中的整数的区间保证 a+ba-b 是精确的 -252 到 +252 sup>,包括在内。

    【讨论】:

    • @Ben:2e53 不是 2 的 53 次方,是 2 乘以 10 的 53 次方,所以是 2*10**53,在这个区间之外所有整数都是可表示的。 2e53-5 不可表示。
    • 2^53 在 JavaScript 中是 Math.pow(2, 53)
    • @Ben:JavaScript 没有提供一种在浮点中指定此类值的好方法。 C 具有十六进制浮点表示法,其中 253 将是 0x1p53。在 JavaScript 中,您可以使用 Math.pow(2, 53),但 pow 是一个难以实现的函数,我不会依赖于正确计算 Math.pow(2, 53) 的实现,尽管一个好的实现应该如此。可以肯定的是,您可以将 253 准备为 (1<<26)*(1<<27)
    • @Ben:在 JavaScript 中,像 << 这样的按位运算符仅对 32 位整数进行操作。 JavaScript 并非设计为具有强类型的语言。它具有灵活的数字格式,包括一些浮点和一些整数语义。在<< 操作中,左操作数从通用 Number 转换为 32 位整数,然后以 32 位整数格式进行移位。
    • @Ben:我已经编程了超过 1/3 个世纪,为此上过学,做过一些具有挑战性的工作,并且偶尔会接受错误地回答 StackOverflow 问题的教育。阅读有帮助,特别是理解理论来自教科书和学术论文,权威知识来自官方标准(例如,JavaScript 应该遵循ECMA-262 Standard)和软件生产者生产的软件的文档,而不是来自第三方网页。
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 2010-12-26
    • 2015-06-29
    • 2014-01-30
    • 2018-02-23
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多