Articles

倍精度浮動小数点形式

倍精度バイナリ浮動小数点は、パフォーマンスと帯域幅のコストにもかかわらず、単精度浮動小数点よりも範囲が広 それは一般的に単にダブルとして知られています。 IEEE754規格では、binary64を次のように指定しています。

  • 符号ビット:1ビット
  • 指数:11ビット
  • 仮数精度:53ビット(52明示的に格納されています)

符号ビットは、数値の符号を決定します(この数値がゼロの場合を含み、符号付きです)。exponentフィールドは、0から2047までの11ビット符号なし整数で、バイアスされた形式です。exponent値1023は実際のゼロを表します。 指数の範囲は-1023(すべて0)と+1024(すべて1)の指数は特別な数のために予約されているため、-1022から+1023の範囲です。

53ビットの仮数の精度は、15から17桁の有効桁数の精度(2-53÷1.11×10-16)を与えます。 有効桁数が最大15桁のdecimal文字列をIEEE754倍精度表現に変換し、同じ桁数のdecimal文字列に変換すると、最終的な結果は元の文字列と一致する必要があります。 IEEE754倍精度数値を有効桁数が17桁以上の10進文字列に変換してから倍精度表現に戻す場合、最終的な結果は元の数値と一致する必要があります。

形式は仮数部に値1の暗黙の整数ビットを持つ形式で記述されます(特別なデータを除きます。 小数部(F)仮数部の52ビットがメモリ形式に表示されるため、合計精度は53ビット(約16桁の10進数、53log10(2)≤15.955)になります。 ビットは次のようにレイアウトされています。

IEEE754Double浮動小数点形式。svg

与えられたバイアス指数e{\displaystyle e}を持つ与えられた64ビットの倍精度データによって仮定される実数値

e

52ビットの小数は(-1)sign(1. b51b50. . . b0)2×2e−1023{\displaystyle(-1)^{\text{sign}}(1.b_{51}b_{50}。..2^{e-1023}}

(-1)^{\text{sign}}(1.b_{51}b_{50}。..{\displaystyle\sum_{i=1}b{52}b_{52-i}2^{-i}\right)\times2^{e−1023}

または

(-1)sign(1+π i=1 52b52−i2−i)×2e−1023{\displaystyle(-1)){\text{sign}}\left(1+\sum_{i=1}b{52}b_{52-i}2^{-i}\right)\times2^{e-1023}

または

(-1)sign(1+π i=1 52b52-i2-i)×2e-1023{\displaystyle(-1)){\text{sign}}\left(1+\sum_{i=1}b{52}b_{52-i}2^{-i}\right)252=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253=4,503,599,627,370,496と253,503,599,627,370,496と253,503,599,627,370,496=9,007,199,254,740,992表現可能な数値は正確に整数です。 次の範囲では、253から254まで、すべてが2で乗算されるため、表現可能な数値は偶数の数値などです。 逆に、251から252までの前の範囲では、間隔は0.5などです。

2nから2n+1までの範囲の数値の小数部としての間隔は2n−52です。

2nから2n+1までの範囲の数値の小数部としての間隔は2n-52したがって、数値を最も近い表現可能な数値(マシンイプシロン)に丸めるときの最大相対丸め誤差は2-53です。

指数の11ビット幅は、10-308と10308の間の数値を表現することができ、完全な15-17桁の精度を備えています。 精度を犠牲にすることによって、非正規表現は約5×10-324までのより小さな値を可能にする。

Exponent encodingEdit

倍精度バイナリ浮動小数点指数は、オフセット-バイナリ表現を使用してエンコードされ、ゼロオフセットは1023です。IEEE754標準では指数バイアスとも呼ばれています。 このような表現の例は次のようになります。

e=00000000001200116=1: 2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}}

{\displaystyle 2^{1-1023}=2^{-1022}}
(smallest exponent for normal numbers)
e =0111111111123ff16=1023: 2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}}

{\displaystyle 2^{1023-1023}=2^{0}}
(zero offset)
e =10000000101240516=1029: 2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}}

{\displaystyle 2^{1029-1023}=2^{6}}
e =1111111111027fe16=2046: 2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}}

{\displaystyle 2^{2046-1023}=2^{1023}}
(highest exponent)

The exponents 00016 and 7ff16 have a special meaning:

  • 00000000000200016 is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); そして
  • 1111111111127ff16は、π(F=0の場合)とNaNs(F≥0の場合)を表すために使用されます。

ここで、Fは仮数部の小数部です。 すべてのビットパターンは有効な符号化です。

上記の例外を除いて、倍精度数全体は、

(-1)sign×2e−1023×1によって記述されます。

上記の例外を除いて、倍精度数全体は、

(−1)sign×2e-1023×1。 分数{\displaystyle(-1).{\text{sign}}\times2^{e-1023}\times1.{\text{fraction}}}

{\displaystyle(-1).{\text{sign}}\times2^{e-1023}\times1.非正規化(e=0)の場合、倍精度数は次のように記述されます。(-1)sign×2 1-1023×0。 分数=(−1)符号×2−1022×0. 分数{\displaystyle(-1).{\text{sign}}\times2^{1-1023}\times0.{\テキスト{分数}}=(-1){{\テキスト{符号}}\回2^{-1022}\回0。{\text{fraction}}}

{\displaystyle(-1).{\text{sign}}\times2^{1-1023}\times0.{\テキスト{分数}}=(-1){{\テキスト{符号}}\回2^{-1022}\回0。{\text{fraction}}}

EndiannessEdit

このセクションはEndianness§Floating point
今日のユビキタスx86プロセッサはすべてのタイプのデータ(整数、浮動小数点)にリトルエンディアンストレージを使用していますが、浮動小数点数はビッグエンディアン形式で表され、整数はリトルエンディアン形式で表されるハードウェアアーキテクチャがいくつかあります。 倍精度数のための半分のリトルエンディアン、半分のビッグエンディアン浮動小数点表現を持つARMプロセッサがあります: 両方の32ビットワードは、整数レジスタのようなリトルエンディアンに格納されますが、最も重要なものは最初に格納されます。 多くの浮動小数点形式には”ネットワーク”標準表現がないため、XDR標準ではビッグエンディアンIEEE754が表現として使用されています。 したがって、広く普及しているIEEE754浮動小数点標準がエンディアンを指定していないことは奇妙に見えるかもしれません。 理論的には、これは、あるマシンによって書き込まれた標準のIEEE浮動小数点データでさえ、別のマシンによって読み取れない可能性があることを意 しかし、現代の標準的なコンピュータ(すなわち 実際には、浮動小数点数のエンディアンは整数のエンディアンと同じであり、データ型に関係なく変換が簡単であると安全に仮定することができます。 (ただし、特殊な浮動小数点形式を使用する小さな組み込みシステムは別の問題かもしれません。H3>

0 01111111111 00000000000000000000000000000000000000000000000000002≙3FF0 0000 0000 000016 ≙ +20 × 1 = 1

0 01111111111 00000000000000000000000000000000000000000000000000012≙3FF0 0000 0000 000116 ≙ +20 × (1 + 2-52) ≈ 1.0000000000000002, the smallest number > 1

0 01111111111 00000000000000000000000000000000000000000000000000102 ≙ 3FF0 0000 0000 000216 ≙ +20 × (1 + 2−51) ≈ 1.0000000000000004

0 10000000000 00000000000000000000000000000000000000000000000000002 ≙ 4000 0000 0000 000016 ≙ +21 × 1 = 2

1 10000000000 00000000000000000000000000000000000000000000000000002 ≙ C000 0000 0000 000016 ≙ −21 × 1 = −2

0 10000000000 10000000000000000000000000000000000000000000000000002 ≙ 4008 0000 0000 000016 ≙ +21 × 1.12 = 112 = 3

0 10000000001 00000000000000000000000000000000000000000000000000002 ≙ 4010 0000 0000 000016 ≙ +22 × 1 = 1002 = 4

0 10000000001 01000000000000000000000000000000000000000000000000002 ≙ 4014 0000 0000 000016 ≙ +22 × 1.012 = 1012 = 5

0 10000000001 10000000000000000000000000000000000000000000000000002 ≙ 4018 0000 0000 000016 ≙ +22 × 1.12 = 1102 = 6

0 10000000011 01110000000000000000000000000000000000000000000000002 ≙ 4037 0000 0000 000016 ≙ +24 × 1.01112 = 101112 = 23

0 01111111000 10000000000000000000000000000000000000000000000000002 ≙ 3F88 0000 0000 000016 ≙ +2−7 × 1.12 = 0.000000112 = 0.01171875 (3/256)

0 00000000000 00000000000000000000000000000000000000000000000000012 ≙ 0000 0000 0000 000116 ≙ +2−1022 × 2−52 = 2−1074
≈ 4.9406564584124654 × 10−324 (Min. subnormal positive double)

0 00000000000 11111111111111111111111111111111111111111111111111112 ≙ 000F FFFF FFFF FFFF16 ≙ +2−1022 × (1 − 2−52)
≈ 2.2250738585072009 × 10−308 (Max. subnormal double)

0 00000000001 00000000000000000000000000000000000000000000000000002 ≙ 0010 0000 0000 000016 ≙ +2−1022 × 1
≈ 2.2250738585072014 × 10−308 (Min. normal positive double)

0 11111111110 11111111111111111111111111111111111111111111111111112 ≙ 7FEF FFFF FFFF FFFF16 ≙ +21023 × (1 + (1 − 2−52))
≈ 1.7976931348623157 × 10308 (Max. Double)

0 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 0000 0000 0000 000016 ≙ +0

1 00000000000 00000000000000000000000000000000000000000000000000002 ≙ 8000 0000 0000 000016 ≙ −0

0 11111111111 00000000000000000000000000000000000000000000000000002 ≙ 7FF0 0000 0000 000016 ≙ +∞ (positive infinity)

1 11111111111 00000000000000000000000000000000000000000000000000002 ≙ FFF0 0000 0000 000016 ≙ −∞ (negative infinity)

0 11111111111 00000000000000000000000000000000000000000000000000012 ≙ 7FF0 0000 0000 000116 ≙ NaN (sNaN on most processors, such as x86 and ARM)

0 11111111111 10000000000000000000000000000000000000000000000000012 ≙ 7FF8 0000 0000 000116 ≙ NaN (qNaN on most processors, such as x86 and ARM)

0 11111111111 11111111111111111111111111111111111111111111111111112≙7FFF FFFF FFFF FFFF16NaN NaN(NaNの代替エンコーディング)

0 01111111101 01010101010101010101010101010101010101010101010101012=3FD5 5555 5555 555516 ≙ +2-2 × (1 + 2-2 + 2-4 + … +2-52)≈1/3

0 10000000000 10010010000111111011010101000100010000101101000110002=4009 21FB5444 2D1816pi pi

qNaNとsNaNのエンコーディングはIEEE754で完全に指定されておらず、プロセッサに依存しています。 X86ファミリやARMファミリプロセッサなどのほとんどのプロセッサは、仮数フィールドの最上位ビットを使用して静かなNaNを示します。 PA-RISCプロセッサは、信号NaNを示すためにこのビットを使用します。

デフォルトでは、仮数部のビット数が奇数であるため、単精度のようにupではなく、1/3が切り捨てられます。

より詳細には:

Given the hexadecimal representation 3FD5 5555 5555 555516, Sign = 0 Exponent = 3FD16 = 1021 Exponent Bias = 1023 (constant value; see above) Fraction = 5 5555 5555 555516 Value = 2(Exponent − Exponent Bias) × 1.Fraction – Note that Fraction must not be converted to decimal here = 2−2 × (15 5555 5555 555516 × 2−52) = 2−54 × 15 5555 5555 555516 = 0.333333333333333314829616256247390992939472198486328125 ≈ 1/3

倍精度arithmeticEditでの実行速度

倍精度浮動小数点変数と数学関数(sin、cos、atan2、log、exp、sqrtなど)を使用すると、単精度の対応 これが特定の問題である計算の1つの領域は、Gpu上で実行される並列コードです。 たとえば、NVIDIAのCUDAプラットフォームを使用する場合、倍精度での計算は、ハードウェアに応じて、単精度で行われる計算と比較して約2〜32倍の時間がかかります。

整数値の精度の制限編集

  • -253から253までの整数(-9007199254740992から9007199254740992)を正確に表すことができます
  • 253から254までの整数=18014398509481984 2の倍数(偶数)に丸めます
  • 254と255の間の整数=36028797018963968 4の倍数に丸めます

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です