【问题标题】:Range of integers that can be expressed precisely as floats / doubles [duplicate]可以精确表示为浮点数/双精度数的整数范围[重复]
【发布时间】:2013-03-16 14:27:30
【问题描述】:

可以表示为双精度(分别是浮点数?)的(连续)整数的确切范围是多少我问的原因是因为我很好奇questions such as this one何时会发生精度损失。

那是

  1. 什么是最小正整数m 使得m+1 不能精确地表示为双精度(分别是浮点数)?
  2. 什么是最大的负整数-n 使得-n-1 不能精确地表示为双精度(分别是浮点数)? (可能与上述相同)。

这意味着-nm 之间的每个整数都有一个精确的浮点表示。我基本上是在寻找浮点数和双精度数的范围 [-n, m]

让我们将范围限制为standard IEEE 754 32 位和 64 位浮点表示。我知道浮点数有 24 位精度,双精度数有 53 位(两者都有隐藏的前导位),但由于浮点表示的复杂性,我正在为此寻找权威答案。请不要挥手!

(理想的答案是证明从0m 的所有整数都是可表达的,而m+1 不是。)

【问题讨论】:

    标签: c# java floating-point integer double


    【解决方案1】:

    由于您询问的是 IEEE 浮点类型,因此语言无关紧要。

    #include <iostream>
    using namespace std;
    
    int main(){
    
        float f0 = 16777215.; // 2^24 - 1
        float f1 = 16777216.; // 2^24
        float f2 = 16777217.; // 2^24 + 1
    
        cout << (f0 == f1) << endl;
        cout << (f1 == f2) << endl;
    
        double d0 = 9007199254740991.; // 2^53 - 1
        double d1 = 9007199254740992.; // 2^53
        double d2 = 9007199254740993.; // 2^53 + 1
    
        cout << (d0 == d1) << endl;
        cout << (d1 == d2) << endl;
    }
    

    输出:

    0
    1
    0
    1
    

    所以浮点数的限制是 2^24。 double 的限制是 2^53。负数相同,因为唯一的区别是符号位。

    【讨论】:

    • 我使用语言进行了标记,因为我尝试的其他标记没有流量。不过感谢您的回答!
    • Kyurem 在他的分析中死心塌地。但是,如果您想要一个经验解决方案,只需使用 for 循环进行测试:float f = 0; for (;;++f) { if (f == (f+1)) { cout &lt;&lt; f; break; } }。双打和负数类似。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多