2013-03-26 197 views
5

可以用double(或float)表示的(连续)整数的确切范围是什么?我问的原因是因为我很好奇questions such as this one将会发生精度损失。可精确表达为浮点数/双精度的整数范围

也就是说

  1. 什么是最小正整数m这样m+1不能准确地表示为双(相应浮动)?
  2. 什么是最大的负整数-n这样-n-1不能精确地表示为双精度浮点数? (可能与上面相同)。

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

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

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

回答

6

既然你问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。而双倍的限制是2^53。因为唯一的区别是符号位,所以负号是相同的。

+0

我用语言标记,因为我没有尝试过其他标记的流量。谢谢你的回答! – 2013-03-26 17:19:28

+0

Kyurem在他的分析中死光。但是如果你想要一个经验的解决方案,只需用一个for循环进行测试:'float f = 0; for(;; ++ f){if(f ==(f + 1)){cout << f;打破; }}。类似的双打和消极。 – 2013-03-26 17:33:34