printf
を使用していくつかの浮動小数点数を出力しようとしています。例えば:
int main()
{
printf("%.1f",76.75);
return 0;
}
出力:76.8
そして、私は結果についていくつか質問があります。
まず第一に、なぜそれは76.7を印刷しなかったのですか?
第二に、それはどのように数を丸めましたか?
既存の回答に加えて、多くのCコンパイラは浮動小数点の問題についてIEEE754に準拠しようとしていることに注意してください。 IEEE 754は、2進浮動小数点から10進数への変換について、現在の丸めモードに従って丸めることを推奨しています。デフォルトの丸めモードは「最も近い値に丸め、偶数に結び付ける」です。一部のコンパイルプラットフォームは、丸めモードを考慮せず、浮動小数点から10進数への変換で、デフォルトの最も近い偶数モードに従って常に丸めます。
76.75
は数値7675/100を正確に表し、76.7と76.8のちょうど中間にあります。後者の数値は、「最も近い偶数に丸める」を適用する場合、「偶数」の数値と見なされます。これがおそらく、コンパイルプラットフォームが、浮動小数点数の10進数への変換としてこの10進数表現を生成することを選択した理由です76.75
。
C99§7.19.6.1
fprintf
関数
f
、F
浮動小数点数を表す
double
引数は、スタイル[−]ddd.ddd
の10進表記に変換されます。ここで、小数点文字の後の桁数は精度指定と同じです。精度が欠落している場合は、6と見なされます。精度がゼロで、#
フラグが指定されていない場合、小数点文字は表示されません。小数点文字が表示される場合、その前に少なくとも1桁が表示されます。 値は適切な桁数に丸められます。
まず第一に、なぜ彼は76.7を印刷しなかったのですか?
言語仕様では、下位桁は丸められると規定されているためです。
彼はどのように数を丸めましたか? (いくつかのコードが役立ちます)
これは、実装ごとに異なります。 ドキュメント によると、
下位桁は、実装定義の方法で丸められます(強調が追加されます)。