web-dev-qa-db-ja.com

16ビット、32ビット、および64ビットIEEE-754システムで表現できる数値の範囲は?

浮動小数点数がどのように表されるかについては少し知っていますが、十分ではありません。

一般的な質問は次のとおりです。

与えられた精度(私の目的では、基数10の正確な小数点以下の桁数)に対して、16ビット、32ビット、および64ビットIEEE-754システムで表現できる数値の範囲は?

具体的には、+ /-0.5(1の位)または+/- 0.0005(1000の位)に正確な16ビットと32ビットの数値の範囲にのみ興味があります。

70
Nate Parsons

特定の IEEE-754 浮動小数点数[〜#〜] x [〜#〜]の場合、

2^E <= abs(X) < 2^(E+1)

次に、[〜#〜] x [〜#〜]から次に表現可能な浮動小数点数( ε までの距離)は:

epsilon = 2^(E-52)    % For a 64-bit float (double precision)
epsilon = 2^(E-23)    % For a 32-bit float (single precision)
epsilon = 2^(E-10)    % For a 16-bit float (half precision)

上記の方程式により、以下を計算できます。

  • 半精度 ...

    +/- 0.5(または2 ^ -1)の精度が必要な場合、数値の最大サイズは2 ^ 10です。これより大きく、浮動小数点数間の距離が0.5より大きい。

    +/- 0.0005(約2 ^ -11)の精度が必要な場合、数値の最大サイズは1です。これより大きく、浮動小数点数間の距離は0.0005より大きいです。

  • 単精度 ...

    +/- 0.5(または2 ^ -1)の精度が必要な場合、数値の最大サイズは2 ^ 23です。これより大きく、浮動小数点数間の距離が0.5より大きい。

    +/- 0.0005(約2 ^ -11)の精度が必要な場合、数値の最大サイズは2 ^ 13です。これより大きく、浮動小数点数間の距離が0.0005より大きい。

  • 倍精度 ...の場合

    +/- 0.5(または2 ^ -1)の精度が必要な場合、数値の最大サイズは2 ^ 52です。これより大きく、浮動小数点数間の距離が0.5より大きい。

    +/- 0.0005(約2 ^ -11)の精度が必要な場合、数値の最大サイズは2 ^ 42です。これより大きく、浮動小数点数間の距離が0.0005より大きい。

94
gnovice

浮動小数点整数の場合(IEEE倍精度の観点から答えを出します)、1から2 ^ 53までのすべての整数が正確に表現可能です。 2 ^ 53を超えると、正確に表現可能な整数は、2の累乗を増やすことによって間隔が空けられます。例えば:

  • 2 ^ 53 + 2と2 ^ 54の間の2番目の整数はすべて正確に表現できます。
  • 2 ^ 54 + 4と2 ^ 55の間の4番目の整数ごとに正確に表現できます。
  • 2 ^ 55 + 8から2 ^ 56までの8番目の整数ごとに正確に表現できます。
  • 2 ^ 56 + 16〜2 ^ 57の間の16番目の整数はすべて正確に表現できます。
  • 2 ^ 57 + 32〜2 ^ 58の間の32番目の整数はすべて正確に表現できます。
  • 2 ^ 58 + 64〜2 ^ 59の64番目の整数ごとに正確に表現できます。
  • 2 ^ 59 + 128から2 ^ 60までの128番目の整数はすべて正確に表現できます。
  • 2 ^ 60 + 256と2 ^ 61の間の256番目の整数ごとに正確に表現できます。
  • 2 ^ 61 + 512と2 ^ 62の間の512番目の整数はすべて正確に表現できます。 。 。 。

正確に表現できない整数は最も近い表現可能な整数に丸められるため、最悪の場合の丸めは表現可能な整数間の間隔の1/2になります。

21
Rick Regan

Peter RのMSDN refへのリンクから引用された精度は、おそらく良い経験則ですが、もちろん現実はもっと複雑です。

「浮動小数点」の「ポイント」が小数点ではなくbinaryポイントであるという事実は、直感を打ち破る方法があります。古典的な例は0.1で、10進数で1桁の精度しか必要としませんが、2進数で正確に表現することはできません。

週末に殺す場合は、 すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと をご覧ください。 Precision および Binary to Decimal Conversion のセクションに特に興味があるでしょう。

17
bendin

まず、IEEE-754-2008も-1985も16ビットの浮動小数点を持ちません。ただし、5ビットの指数と10ビットの小数部を含む提案された加算です。 IEE-754は専用の符号ビットを使用するため、正と負の範囲は同じです。また、分数の前に暗黙の1があるため、余分なビットが得られます。

各整数を表すことができるように、1桁の精度が必要な場合、答えは非常に簡単です。指数は小数点を小数部の右端にシフトします。したがって、10ビットの小数部では±2になります11

小数点の後に1ビットが必要な場合は、その前に1ビットを放棄するため、±210

単精度には23ビットの小数部があるため、±224 整数。

小数点の後に必要な精度のビット数は、実行している計算と実行している計算数に完全に依存します。

  • 210 = 1,024
  • 211 = 2,048
  • 223 = 8,388,608
  • 224 = 16,777,216
  • 253 = 9,007,199,254,740,992(倍精度)
  • 2113 = 10,384,593,717,069,655,257,060,992,658,440,192(4倍精度)

こちらもご覧ください

4
derobert

IEEE 754-1985 を参照してください:

v = (-1)^sign * s^(exponent-exponent_bias) * (1 + fraction)

注(1 +分数)。 @ bendin が指すように、2進浮動小数点を使用すると、0.1などの単純な10進値を表現できません。これは、単純な追加を何回も実行したり、切り捨てなどの呼び出しを行ったりすることで、丸めエラーが発生する可能性があることを意味します。何らかの精度に関心がある場合、それを実現する唯一の方法は、基本的にスケーリングされた整数である固定小数点を使用することです。

2
Eugene Yokota

Javaでdoubleを使用しているとき、計算の精度が大幅に低下していないことを理解するのにかなり時間がかかりました。浮動小数点は、実際には、かなり合理的な精度で数値を表現する非常に優れた能力を持っています。私が失っていた精度はすぐに変換した 小数 ユーザーが入力した番号 バイナリ ネイティブにサポートされている浮動小数点表現。私は最近、すべての数字をBigDecimalに変換し始めました。 BigDecimalは、プリミティブ型の1つではないため、floatやdoubleよりもコードでの処理がはるかに多くなります。しかし、一方で、ユーザーが入力した数字を正確に表すことができます。

0
PanCrit

あなたの質問を正しく理解できれば、それはあなたの言語に依存します。
C#については、 MSDN ref をご覧ください。 Floatの精度は7桁で、15-16桁の倍精度です。

0
Peter R