2013-03-26 203 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