浮動小数点の精度は可変ですか、それとも不変ですか? 質問する

浮動小数点の精度は可変ですか、それとも不変ですか? 質問する

float浮動小数点数 (つまり、、doubleまたはlong double) には精度の値が 1 つだけあるのか、それとも変化する精度の値があるのか​​について、矛盾した回答が返ってきます。

1つのトピックは浮動小数点数と倍精度浮動小数点の精度は絶対的であることを意味しているようです。

しかし、別の話題としてfloatとdoubleの違い言う、

一般的にダブルは15から16精度の小数点以下の桁数

別のソース言う、

float型の変数の精度は通常について7桁の有効数字

double型の変数の精度は通常について16桁の有効数字

値が正確でないと簡単に壊れてしまうような機密性の高いコードを扱う場合、上記のような近似値を参照するのは好きではありません。では、事実を明確にしましょう。浮動小数点の精度は可変ですか、それとも不変ですか。また、その理由は何でしょうか。

ベストアンサー1

精度は固定されており、正確に53の2進数倍精度の場合は52(先頭の1を除けば52)。これは次のようになる。約15桁


OP は、2 進数がちょうど 53 桁であることが、10 進数が「約」15 桁になる理由を詳しく説明するように私に求めました。

これを直感的に理解するために、精度の低い浮動小数点形式を考えてみましょう。倍精度数値のような 52 ビットの仮数ではなく、4 ビットの仮数を使用します。

したがって、各数値は (-1) s × 2 yyy × 1.xxxxのようになります( はs符号ビット、yyyは指数、1.xxxxは正規化された仮数です)。ここでは、符号や指数ではなく、仮数のみに焦点を当てます。

1.xxxxすべての値がどのようになるかを示した表を以下に示しますxxxx(すべての丸めは、デフォルトの浮動小数点丸めモードと同じように、半分から偶数になります)。

  xxxx  |  1.xxxx  |  value   |  2dd  |  3dd  
--------+----------+----------+-------+--------
  0000  |  1.0000  |  1.0     |  1.0  |  1.00
  0001  |  1.0001  |  1.0625  |  1.1  |  1.06
  0010  |  1.0010  |  1.125   |  1.1  |  1.12
  0011  |  1.0011  |  1.1875  |  1.2  |  1.19
  0100  |  1.0100  |  1.25    |  1.2  |  1.25
  0101  |  1.0101  |  1.3125  |  1.3  |  1.31
  0110  |  1.0110  |  1.375   |  1.4  |  1.38
  0111  |  1.0111  |  1.4375  |  1.4  |  1.44
  1000  |  1.1000  |  1.5     |  1.5  |  1.50
  1001  |  1.1001  |  1.5625  |  1.6  |  1.56
  1010  |  1.1010  |  1.625   |  1.6  |  1.62
  1011  |  1.1011  |  1.6875  |  1.7  |  1.69
  1100  |  1.1100  |  1.75    |  1.8  |  1.75
  1101  |  1.1101  |  1.8125  |  1.8  |  1.81
  1110  |  1.1110  |  1.875   |  1.9  |  1.88
  1111  |  1.1111  |  1.9375  |  1.9  |  1.94

提供される小数点の桁数はいくつですか? 小数点 2 桁の範囲の各値は一意ではないもののカバーされるので 2 桁であると言えます。または、すべての一意の値はカバーされるが、小数点 3 桁の範囲のすべての値はカバーされないので 3 桁であると言えます。

議論のために、小数点以下の桁数は 2 桁とします。小数点以下の精度は、それらの小数点以下の桁のすべての値を表現できる桁数になります。


さて、それでは、すべての数字を半分にすると(つまりyyy= -1 を使用すると)どうなるでしょうか?

  xxxx  |  1.xxxx  |  value    |  1dd  |  2dd  
--------+----------+-----------+-------+--------
  0000  |  1.0000  |  0.5      |  0.5  |  0.50
  0001  |  1.0001  |  0.53125  |  0.5  |  0.53
  0010  |  1.0010  |  0.5625   |  0.6  |  0.56
  0011  |  1.0011  |  0.59375  |  0.6  |  0.59
  0100  |  1.0100  |  0.625    |  0.6  |  0.62
  0101  |  1.0101  |  0.65625  |  0.7  |  0.66
  0110  |  1.0110  |  0.6875   |  0.7  |  0.69
  0111  |  1.0111  |  0.71875  |  0.7  |  0.72
  1000  |  1.1000  |  0.75     |  0.8  |  0.75
  1001  |  1.1001  |  0.78125  |  0.8  |  0.78
  1010  |  1.1010  |  0.8125   |  0.8  |  0.81
  1011  |  1.1011  |  0.84375  |  0.8  |  0.84
  1100  |  1.1100  |  0.875    |  0.9  |  0.88
  1101  |  1.1101  |  0.90625  |  0.9  |  0.91
  1110  |  1.1110  |  0.9375   |  0.9  |  0.94
  1111  |  1.1111  |  0.96875  |  1.   |  0.97

先ほどと同じ基準で、1桁の小数点を扱います。指数に応じて、小数点の桁数が増えたり減ったりすることがわかります。2進数と10進数の浮動小数点数は互いにきれいにマッピングされない

同じ議論は倍精度浮動小数点数 (52 ビット仮数) にも当てはまりますが、その場合のみ、指数に応じて 15 桁または 16 桁の 10 進数が得られます。

おすすめ記事