質問

int main()
{
  float x=3.4e2;
  printf("%f",x);
  return 0;
}

出力:

340.000000  // It's ok.

しかし、書き込みが出力をx=3.1234e2場合は312.339996x=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のフォーマット文字列のドキュメントを見てみます。

あなたは正確に小数を表現する必要があるかもしれません。これは、多くの場合、財務アプリケーションで起こります。その場合、あなたは、(セントとしてではなく、ドルとドルの画分として量を表すように)数値を整数として、または単に計算のすべてを表現するために、特別なライブラリを使用する必要があります。

は、標準の参照がある何すべてのコンピュータ科学者することがわかっている浮動小数点演算について、それはあなたのために非常に高度になるようです。また、あなたがGoogleの浮動小数点形式(特にIEEE標準フォーマット)できたか、詳細を望んでいた場合は、Wikipediaでそれらを見ています。

scroll top