浮動小数点数の表現方法については少し知っていますが、十分ではありません。
一般的な質問は次のとおりです。
特定の精度 (私の目的では、基数 10 の正確な小数点以下の桁数) で、16 ビット、32 ビット、および 64 ビットの IEEE-754 システムで表現できる数値の範囲は?
具体的には、+/-0.5 (一の位) または +/- 0.0005 (千の位) の精度の 16 ビットおよび 32 ビットの数値の範囲にのみ関心があります。
浮動小数点数の表現方法については少し知っていますが、十分ではありません。
一般的な質問は次のとおりです。
特定の精度 (私の目的では、基数 10 の正確な小数点以下の桁数) で、16 ビット、32 ビット、および 64 ビットの IEEE-754 システムで表現できる数値の範囲は?
具体的には、+/-0.5 (一の位) または +/- 0.0005 (千の位) の精度の 16 ビットおよび 32 ビットの数値の範囲にのみ関心があります。
特定のIEEE-754浮動小数点数Xに対して、
2^E <= abs(X) < 2^(E+1)
Xから次に大きい表現可能な浮動小数点数 ( epsilon )までの距離は次のとおりです。
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 のべき乗で間隔が空けられます。例えば:
正確に表現できない整数は、最も近い表現可能な整数に丸められるため、最悪の場合の丸めは、表現可能な整数間の間隔の 1/2 になります。
Peter R の MSDN ref へのリンクから引用された精度は、おそらく経験則としては適切ですが、もちろん現実はもっと複雑です。
「浮動小数点」の「点」が小数点ではなく2 進小数点であるという事実は、私たちの直感を打ち負かす方法を持っています。古典的な例は 0.1 で、10 進数で 1 桁の精度が必要ですが、2 進数ではまったく正確に表現できません。
暇な週末がある場合は、「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」をご覧ください。おそらく、 PrecisionおよびBinary to Decimal Conversionのセクションに特に関心があるでしょう。
まず、IEEE-754-2008 も -1985 も 16 ビット浮動小数点数を持っていません。しかし、それは 5 ビットの指数と 10 ビットの小数部を持つ提案された加算です。IEE-754 は専用の符号ビットを使用するため、正と負の範囲は同じです。また、分数の前に暗黙の 1 があるため、余分なビットが得られます。
各整数を表すことができるように、1 位までの精度が必要な場合、答えはかなり単純です。指数は小数点を分数の右端にシフトします。したがって、10 ビットの端数は ±2 11になります。
小数点以下 1 ビットが必要な場合は、その前の 1 ビットを放棄するので、±2 10になります。
単精度には 23 ビットの小数部があるため、±2 24の整数になります。
小数点の後に必要な精度のビット数は、実行している計算と、実行している数に完全に依存します。
IEEE 754-1985を参照してください。
(1 + 分数) に注意してください。@bendinが指摘しているように、2 進浮動小数点を使用すると、0.1 などの単純な 10 進数値を表現できません。つまり、簡単な加算を何度も行ったり、切り捨てなどを呼び出したりすることで、丸め誤差を導入できるということです。あらゆる種類の精度に関心がある場合、それを達成する唯一の方法は、基本的にスケーリングされた整数である固定小数点 10 進数を使用することです。
Java で double を使用しても、計算の精度が大幅に低下していないことを理解するのにかなりの時間がかかりました。浮動小数点は、実際には数値を非常に適切な精度で表現する非常に優れた機能を備えています。私が失っていた精度は、ユーザーが入力した10 進数を、ネイティブでサポートされている2 進浮動小数点表現に変換した直後でした。最近、すべての数値を BigDecimal に変換し始めました。BigDecimal は、プリミティブ型の 1 つではないため、float や double よりもコード内で処理する作業がはるかに多くなります。しかし一方で、ユーザーが入力した数値を正確に表すこともできます。
私があなたの質問を正しく理解しているかどうかは、あなたの言語によって異なります。
C# については、MSDN refを確認してください。Float の精度は 7 桁で、倍精度は 15 ~ 16 桁です。