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

出力:

340.000000//大丈夫です。

しかし、書き込みの場合、x=3.1234e2出力はであり、出力はです。312.339996x=3.12345678e2312.345673

なぜこのような出力なのですか?私x=3.1234e2が出力を書くなら、そうあるべきだと思います312.340000が、実際の出力は312.339996GCCコンパイラを使用しています。

4

2 に答える 2

9

すべての小数が正確に同等の2進数であるとは限らないため、最も近い値に丸められます。

簡略化した例、

小数部に3ビットがある場合、次のことができます。

0
0.125
0.25
0.375
...

0.5は正確な表現ですが、0.1は0.125として表示されます。

もちろん、実際の違いははるかに小さいです。

于 2010-10-01T13:40:09.113 に答える
2

浮動小数点数は通常、効率を上げるために、2の小数に2の累乗を掛けたものとして表されます。これは、2進数の分数として正確に表現できない小数の分数があることを除いて、基数10の表現とほぼ同じくらい正確です。代わりに、それらは近似値として表されます。

さらに、afloatは通常32ビット長です。つまり、有効桁数はそれほど多くありません。例では、有効数字が約8桁であることがわかります。

ただし、数値をその重要性をわずかに超えて印刷しているため、違いがわかります。より少ない桁数を印刷する方法については、printfフォーマット文字列のドキュメントを参照してください。

10進数を正確に表す必要がある場合があります。これは、金融アプリケーションでよく発生します。その場合、特別なライブラリを使用して数値を表すか、すべてを整数として計算する必要があります(金額をドルやドルの分数ではなくセントで表すなど)。

標準のリファレンスは、すべてのコンピューター科学者が浮動小数点演算について知っておくべきことですが、それはあなたにとって非常に進んでいるように見えます。または、詳細が必要な場合は、Google浮動小数点形式(特にIEEE標準形式)を使用するか、ウィキペディアで検索することもできます。

于 2010-10-01T15:41:25.927 に答える