倍精度浮動小数点形式
倍精度バイナリ浮動小数点は、パフォーマンスと帯域幅のコストにもかかわらず、単精度浮動小数点よりも範囲が広 それは一般的に単にダブルとして知られています。 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)になります。 ビットは次のようにレイアウトされています。
与えられたバイアス指数e{\displaystyle e}を持つ与えられた64ビットの倍精度データによって仮定される実数値
52ビットの小数は(-1)sign(1. b51b50. . . b0)2×2e−1023{\displaystyle(-1)^{\text{sign}}(1.b_{51}b_{50}。..2^{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=000000000012 00116 =1: |
2 1 − 1023 = 2 − 1022 {\displaystyle 2^{1-1023}=2^{-1022}} | (smallest exponent for normal numbers) | |
e =011111111112 3ff16 =1023: |
2 1023 − 1023 = 2 0 {\displaystyle 2^{1023-1023}=2^{0}} | (zero offset) | |
e =100000001012 40516 =1029: |
2 1029 − 1023 = 2 6 {\displaystyle 2^{1029-1023}=2^{6}} | ||
e =111111111102 7fe16 =2046: |
2 2046 − 1023 = 2 1023 {\displaystyle 2^{2046-1023}=2^{1023}} | (highest exponent) |
The exponents 00016
and 7ff16
have a special meaning:
-
000000000002
00016
is used to represent a signed zero (if F = 0) and subnormals (if F ≠ 0); そして -
111111111112
7ff16
は、π(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}}}
EndiannessEdit
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の倍数に丸めます