2017-07-28 18 views
-4

私はこのコードを最近見つけました。それは奇妙な結果を生み出します(約18桁目の数字の後にランダムな数字がたくさんあります)。私はsprintfの限界についての情報を見つけようとしましたが、見つけられませんでした。私は答えが実際に正しいかどうか、あるいはゴミだけであるかどうかを判断しようとしています。 (doubleとして)0.025を通過したときには、プリントアウトし:sprintf精度の制限

0.025000000000000001387778780781445675529539585113525390625

#define MAX_NUM_STR_LEN 128 
void File_WriteNumber(File *fp, double value) { 
    char numbuf[MAX_NUM_STR_LEN]; 
    int sz = sprintf(numbuf, "%.100g", value); 
    fwrite (numbuf , sizeof(char), sz, fp); 
} 
+2

https://stackoverflow.com/questions/588004/is-floating-point-math-broken – yano

+0

あなたは '0.25'または' 0.025'を渡していますか? –

+0

@MichaelAlbers oops。修正されました。 – Jiminion

答えて

4

回答は、実際には正しいです - ランダムではない数字。


doubleは、典型的には、正確約2 異なる値を表すことができます。

0.025は、binary64doubleの1つではありません。

最も近いdoubleが0.025000000000000001387です....
次に近いdoubleが0.024999999999999997918です...

sprintf()はうまくやっています。