web-dev-qa-db-ja.com

なぜprintfは浮動小数点数を丸めるのですか?

printfを使用していくつかの浮動小数点数を出力しようとしています。例えば:

int main()
{
    printf("%.1f",76.75); 
    return 0;
}

出力:76.8

そして、私は結果についていくつか質問があります。

まず第一に、なぜそれは76.7を印刷しなかったのですか?

第二に、それはどのように数を丸めましたか?

14
Malic Of Sdom

既存の回答に加えて、多くのCコンパイラは浮動小数点の問題についてIEEE754に準拠しようとしていることに注意してください。 IEEE 754は、2進浮動小数点から10進数への変換について、現在の丸めモードに従って丸めることを推奨しています。デフォルトの丸めモードは「最も近い値に丸め、偶数に結び付ける」です。一部のコンパイルプラットフォームは、丸めモードを考慮せず、浮動小数点から10進数への変換で、デフォルトの最も近い偶数モードに従って常に丸めます。

76.75は数値7675/100を正確に表し、76.7と76.8のちょうど中間にあります。後者の数値は、「最も近い偶数に丸める」を適用する場合、「偶数」の数値と見なされます。これがおそらく、コンパイルプラットフォームが、浮動小数点数の10進数への変換としてこの10進数表現を生成することを選択した理由です76.75

12
Pascal Cuoq

C99§7.19.6.1fprintf関数

fF

浮動小数点数を表すdouble引数は、スタイル[−]ddd.dddの10進表記に変換されます。ここで、小数点文字の後の桁数は精度指定と同じです。精度が欠落している場合は、6と見なされます。精度がゼロで、#フラグが指定されていない場合、小数点文字は表示されません。小数点文字が表示される場合、その前に少なくとも1桁が表示されます。 値は適切な桁数に丸められます。

11
Yu Hao

まず第一に、なぜ彼は76.7を印刷しなかったのですか?

言語仕様では、下位桁は丸められると規定されているためです。

彼はどのように数を丸めましたか? (いくつかのコードが役立ちます)

これは、実装ごとに異なります。 ドキュメント によると、

下位桁は、実装定義の方法で丸められます(強調が追加されます)。

7
dasblinkenlight