2012-10-10 12 views
9

Cのfloatタイプの説明では、有効桁数は6であると記載されています。しかし、浮動小数点型の有効桁数

float f = 12345.6; 

、その後のprintfを使用してそれを印刷()は、12345.599609を印刷し、12345.6が印刷されません。したがって、「6桁の有効数字」(または「doubleの場合は15」)は浮動小数点型を意味しますか?

+8

浮動小数点型はベース10に格納されないので、重要な* 10進数の桁数は必然的に近似値になります。 –

+2

実際にはexpに8ビット、fracに23ビットがあります。 – halfelf

答えて

10

standardによれば、すべての10進数を正確にメモリに格納することはできません。表現のサイズによっては、エラーが特定の最大値に達することがあります。 floatの場合、これは0.0001%(6桁有効数字= 10^-6 = 10^-4 %)です。

エラーの場合、エラーは(12345.6 - 12345.599609)/12345.6 = 3.16e-08で、浮動小数点の最大誤差よりもはるかに小さいです。

16

有効桁数6は、最大誤差が約+/- 0.0001%であることを意味します。単一の浮動小数点値は実際に約7.2桁の精度(source)を持ちます。これは、誤差が約+/- 12345.6/10^7 = 0.0であることを意味します。あなたのエラーの順番はどれですか(0.000391)。

0

ここで問題となるのは、数値を浮動小数点数に格納できることを保証できないことです。 IEEE 754が説明するように、仮数、底数、および指数でこの数値を表す必要があります。番号printf(...)には、あなたが格納されていた実際のフロート番号が表示されます。浮動小数点数の有効数字の数を保証することはできません。

7

あなたが見ているのは実際には有効数字ではありませんが、コンピュータ上の数値はバイナリ形式で保存されており、3/5(= 0.6)の有限バイナリ形式は存在しません。バイナリで3/5は0.100110011001 ...のように見え、 "1001"パターンは永遠に繰り返されます。このシーケンスは、0.599999 ...と繰り返されます。実際には、小数点の右側の小数点以下3桁に到達してから、精度に関連するエラーが発生します。

これは1/3の有限ベース10表現がない方法と似ています。永遠に0.3333繰り返す。

関連する問題