16、32、64 ビットの IEEE-754 システムではどの範囲の数値を表現できますか?

StackOverflow https://stackoverflow.com/questions/872544

質問

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

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

特定の精度 (私の目的では、基数 10 の正確な小数点以下の桁数) について、16、32、および 64 ビットの IEEE-754 システムではどの範囲の数値を表現できますか?

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

役に立ちましたか?

解決

与えられた IEEE-754 浮動小数点数 バツ, 、 もし

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

それからからの距離 バツ 次に大きい表現可能な浮動小数点数 (イプシロン) は:

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 より大きくなります。

他のヒント

浮動小数点整数 (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 になります。

MSDN refにフォームピーター・Rのリンクを引用精度はおそらく親指の良いルールですが、もちろん現実はもっと複雑です。

「浮動小数点」の「点」のバイナリのポイントと小数ないポイントは私達の直感を破っての方法を持っているという事実。古典的な例は、小数点に一つだけ桁の精度を必要とするが、全くバイナリで正確に表現されていない0.1、である。

あなたは週末をお持ちの場合は何すべてのコンピュータ科学者を見て、殺すために浮動小数点演算について知っている必要があります。おそらく、精密の上のセクションで特に興味を持つだろうと進変換するにバイナリます。

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

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

小数点の後に 1 ビットが必要な場合は、その前で 1 ビットを諦めることになるので、±2 になります。10.

単精度の小数部は 23 ビットなので、±2 になります。24 整数。

小数点以下の精度が何ビット必要かは、実行する計算と実行するビット数に完全に依存します。

  • 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 倍精度)

こちらも参照

を参照してください。 IEEE 754-1985 のます:

V =(-1)^記号* S ^(指数-exponent_bias)* (1つの+画分)

注(1つの+画分)。 @bendin の2進浮動小数点を使用して、指摘するように、あなたは簡単な小数を表現することはできません例えば0.1などの値。含意はあなたが単純な加算を何何回もやってたり切り捨てのようなものを呼び出すことによって、丸め誤差を導入できるということです。あなたは一切精度の任意の並べ替えに興味がある場合は、それを達成するための唯一の方法は、基本的にスケーリングされた整数である固定小数点小数を使用することです。

私が正しくあなたの質問を理解していれば、

、それはあなたの言語に依存します。
C#の場合は、 MSDN refのをチェックしてください。フロートは、7桁の精度とダブル15-16桁の精度を持っています。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top