1

重複の可能性:
Objective-Cのフロートの問題

私はこの問題を私が得ることができるのと同じくらい簡単に分解しました。同じことを自由に試して、同じエラーが発生するかどうか、およびどのような解決策があるかを教えてください。私はすでにいくつかのコンピューターでそれを試しました。

float total = 200000.0f + 154196.8f;
NSLog(@"total: %f", total);

出力は次のとおりです。

total: 354196.812500

論理的な説明があれば、遠慮なく共有してください。

4

3 に答える 3

13

フロートをブラッシュアップすることをお勧めします

http://www.altdevblogaday.com/2012/05/20/thats-not-normalthe-performance-of-odd-floats/

より高い精度が必要な場合は、double を使用してください。

さらにhttp://randomascii.wordpress.com/2012/03/08/float-precisionfrom-zero-to-100-digits-2/

于 2012-12-19T15:17:38.487 に答える
7

すべての深い理解については、すべてのプログラマーが浮動小数点演算について知っておくべきことを参照してください。簡単に言えば、すべての浮動小数点表現には精度に制限があり、10 進数では少数の桁数で表現できるものは、2 進数では少数の桁数で表現できない可能性がある (特に浮動小数点形式では表現できない) ということです。 )。

double物事を改善することはできますが、万能薬ではないことに注意してください。であっても、小さな丸め誤差があることはよくあることですdouble。2 を期待すると、1.99999999 を簡単に取得できます。

于 2012-12-19T15:21:12.733 に答える
3

ヒント:

long double total = 200000.0 + 154196.8;
NSLog(@"total: %Lf", total);

私のマシンでは、正しい値が出力されます。
32 ビットの浮動小数点には 23 ビットの仮数があり、最も近い値は 0.5+0.25+0.125 です。
正しい表現を得るには、より多くのビットを使用する必要があります。

于 2012-12-19T15:20:23.080 に答える