2

値のテキスト ファイルがあります。

133.25 129.40 41.69 2.915

私がそれを読んだとき:

fscanf(File, "%f", &floatNumber[i]);

私はこれらの値を取得します:

1.3325000000000000e+002, 1.2939999389648437e+002, 4.1689998626708984e+001 2.9149999618530273e+000

最初の値は問題ありませんが、他の 3 つの値はなぜ異なるのでしょうか?

4

4 に答える 4

2

値は同じです。printf で特定の形式を変更する必要があります。

また、浮動小数点数には離散的な精度があるため、任意の浮動小数点数を無限の精度で表現することはできません。

これは、IEEE 仕様のよく知られた問題です。

于 2013-02-16T17:30:24.317 に答える
1

彼らは違いはありません。浮動小数点はポイントまでしか正確ではありません[sic]。これらは、これらの値に最も近い表現です。浮動小数点は特殊な獣です。

于 2013-02-16T17:29:32.427 に答える
1

値が異なる理由は、最初の数値を除くすべての数値を 2 進浮動小数点値として正確に表すことができないためです。小数の正確な表現が必要な場合は、非標準のライブラリを使用する必要があります

于 2013-02-16T17:31:26.470 に答える
0

ほとんどの入力はどちらの形式でも正確に表すことはできませんが、float ではなく double を使用すると、より多くの一致する数字が得られます。

float は非常に特殊なタイプだと思います。精度の低い浮動小数点データの非常に大きな配列があり、その配列に対して適切に動作する計算のみを実行している場合は、float を使用することでパフォーマンスを向上させることができます。たとえば、キャッシュ ラインでは 2 倍の float が得られます。それ以外については、float より double を優先します。

于 2013-02-16T23:06:19.840 に答える