2013-03-26 12 views
5

double(float型の浮動小数点数)として表現できる(連続する)整数の正確な範囲は何ですか?私がquestions such as this oneについて興味があるからです。精度の低下が生じる。浮動小数点数として正確に表現できる整数の範囲

  1. m+1を正確に二重(それぞれフロート)のように表現することができないように、少なくとも正の整数mは何であるかでありますか
  2. -n-1をdouble(float)として正確に表現できないような最大の負の整数-nは何ですか? (上記と同じかもしれません)。

これは、-nmの間のすべての整数が、正確な浮動小数点表現を持つことを意味します。私は基本的にfloatとdoubleの両方について範囲[-n, m]を探しています。

standard IEEE 754 32ビットおよび64ビットの浮動小数点表現に範囲を限定しましょう。浮動小数点数は24ビットの精度を持ち、倍精度浮動小数点には53ビット(どちらも非表示の先頭ビットが付いています)がありますが、浮動小数点表現の複雑さのために私はこれに対する正式な答えを探しています。手を振らないでください!

(理想の答えは0からmへのすべての整数が表現可能であることを証明する、その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倍の制限は2^53です。唯一の違いは符号ビットなので、ネガティブは同じです。

+0

私が試した他のタグのトラフィックがなかったので、私は言語でタグ付けしました。あなたの答えをありがとう! –

+0

彼の分析では、Kyuremは死んだ。しかし、経験的な解を求めたい場合は、forループを使って簡単にテストしてください: 'float f = 0; for(;; ++ f){if(f ==(f + 1)){cout << f;ブレーク; }} '。ダブルスとネガティブに似ています。 –

関連する問題