2016-12-21 22 views
0

32ビットシステムでは、< 2^31の場合、以下の演算は常に正しい値を返しますが、aが大きい場合はランダムな結果を返します。32ビットシステムで整数と浮動小数点数学演算を行う

uint64_t a = 14227959735; 
uint64_t b = 32768; 
float c = 256.0; 
uint64_t d = a - b/ c; // d returns 14227959808 

ここでの問題は、int-to-float演算が未定義の動作を返すことですが、なぜそれがそのような値を与えるのかを説明する助けとなるでしょうか?

+0

浮動小数点計算は7桁に正確です。http://stackoverflow.com/questions/9765744/precision-in-c-floats – pm100

+1

ランダムまたは定義されていないものはありません。結果は非常に正確です1億ドルの1倍)。単なる丸め誤差です。 'float'ではなく' double'を使用すると正確な結果が得られますが、大きな入力値に対しては丸め誤差を得ることができます。 –

+0

これは重複しているかもしれない多数の質問があります。私が選んだのは、もっとも古いものの一つです(それは優れた答えがあります)。ちなみに、結果は64ビットシステムでも同じです。問題は、 'float'(ほとんどの場合)が4バイトを使用していて、十進数の精度がそれほど多くないことです。 –

答えて

2

計算全体がfloatになり、64ビット整数にキャストされます。しかし浮動小数点数は2のべき乗にならない限り、大きな整数を正確に表すことはできません。

関連する問題