浮動小数点数との混同
-
27-09-2019 - |
質問
int main()
{
float x=3.4e2;
printf("%f",x);
return 0;
}
出力:
340.000000 // It's ok.
しかし、書き込みが出力をx=3.1234e2
場合は312.339996
とx=3.12345678e2
出力が312.345673
ある場合です。
なぜ、このような出力がありますか?私は私の書き込みがx=3.1234e2
場合、出力は312.340000
されるべきだと思うが、実際の出力は、GCCコンパイラを使用して312.339996
です。
解決
未それは最も近い値に丸められますように、すべての端数が正確なバイナリ同等のものを持っています。
簡略化した例
あなたは端数のために3ビットを持っている場合、あなたが持つことができます:
0
0.125
0.25
0.375
...
0.5、正確な表現を有しているが、0.1を0.125として表示されます。
もちろん、本当の違いははるかに小さいます。
他のヒント
浮動小数点数は、通常、効率のために、バイナリフラクション時間ように、2つの力を表現しています。正確ベース10の表現として、正確バイナリ分数として表現できない小数があることを除いなどについてです。彼らは、代わりに、近似値として表現されます。
はまた、float
は、すべてのその多くの有効数字を持っていないことをどの手段、32ビット長通常です。あなたは約8桁まで、彼らがしていることを正確にあなたの例で見ることができます。
あなたは、しかし、少しその重要性を超えたに番号を印刷しているので、あなたは違いを見ています。少ない桁数を印刷する方法を参照するには、あなたのprintf
のフォーマット文字列のドキュメントを見てみます。
あなたは正確に小数を表現する必要があるかもしれません。これは、多くの場合、財務アプリケーションで起こります。その場合、あなたは、(セントとしてではなく、ドルとドルの画分として量を表すように)数値を整数として、または単に計算のすべてを表現するために、特別なライブラリを使用する必要があります。