1. ホーム
  2. c

[解決済み] フロート」対「ダブル」精度

2022-04-27 09:33:58

質問

コード

float x  = 3.141592653589793238;
double z = 3.141592653589793238;
printf("x=%f\n", x);
printf("z=%f\n", z);
printf("x=%20.18f\n", x);
printf("z=%20.18f\n", z);

が出力されます。

x=3.141593
z=3.141593
x=3.141592741012573242
z=3.141592653589793116

ここで、出力の3行目には 741012573242 はゴミで、4行目には 116 はゴミです。2倍算は常に有効数字16桁で、浮動小数点は常に有効数字7桁なのでしょうか?なぜdoubleは有効数字が14桁にならないのですか?

どうすれば解決するの?

C言語での浮動小数点数の利用 IEEE 754 エンコーディングになります。

このタイプのエンコーディングは、符号、シグニフィカント、指数を使用します。

このエンコーディングのため、多くの数値は小さな変更を加えて保存できるようになる。

また、10進法ではなく2進法での表現なので、有効桁数が若干変わることがあります。

単精度(float)では、シグニフィカンドが23ビット、指数が8ビット、符号ビットが1ビットとなります。

倍精度(double)は、52ビットのシグニフィカント、11ビットの指数、および1ビットの符号を与えます。