2

この場合:

float a = 0.99999f;
int b = 1000;
int c = a + b;

結果としてc = 1001bが float (iOS 固有) に変換され、a + b十分な精度がなく1000.9999、(なぜ? ) がより高い値に丸められるために発生することがわかりました。理論的にaは正しい動作です。0.999fc = 1000

だから私の質問は、なぜ浮動小数点数がより高い値に丸められるのですか? この動作 (または規則) はどこに記述されていますか?

これを iPhone シミュレーター、Apple LLVM 4.2 コンパイラーでテストしました。

4

2 に答える 2

4

ではint c = a + b、まず整数bが浮動小数点数に変換され、次に 2 つの浮動小数点数が加算され、結果が整数に切り捨てられます。

デフォルトの浮動小数点丸めモードは ですFE_TONEAREST。これは、加算の結果が

0.99999f + 1000f

はfloat として表すことができる最も近い1001f数値であり、それが numberです。次に、この float は整数に切り捨てられc = 1001ます。

丸めモードを変更した場合

#include <fenv.h>
fesetround(FE_DOWNWARD);

次に、加算の結果が切り捨てられ (約1000.99993f)、取得されc = 1000ます。

于 2013-04-05T12:06:21.687 に答える
1

その理由は、1000 を追加すると合計 8 桁の精度が得られるためですが、IEEE float は 7 桁しかサポートしていません。

于 2013-04-05T11:55:22.490 に答える