6

double(またはfloat)として表現できる(連続した)整数の正確な範囲はどれくらいですか?私が尋ねる理由は、精度が低下するときにこのような質問に興味があるからです。

あれは

  1. double(またはfloat)として正確に表現できない最小の正の整数は何mですか?m+1
  2. double(またはfloat)として正確に表現できない-nような最大の負の整数は何ですか?-n-1(上記と同じ場合があります)。

これは、-nとの間のすべての整数がm正確な浮動小数点表現を持っていることを意味します。私は基本的に[-n, m]フロートとダブルの両方の範囲を探しています。

スコープを標準のIEEE75432ビットおよび64ビット浮動小数点表現に制限しましょう。floatの精度は24ビット、doubleの精度は53ビット(どちらも先頭のビットが非表示)であることはわかっていますが、浮動小数点表現の複雑さのために、これに対する信頼できる答えを探しています。手を振らないでください!

(理想的な答えは、から0までのすべての整数mが表現可能であることを証明しますが、そうでm+1はありません。)

4

1 に答える 1

7

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

したがって、floatの制限は2^24です。また、doubleの制限は2^53です。唯一の違いは符号ビットであるため、負の値は同じです。

于 2013-03-26T17:15:36.917 に答える