IEEE 754 倍精度フォーマット
JavaScript、Python、ほとんどの現代言語で使用される64ビット倍精度IEEE 754フォーマットを探索。符号1ビット、指数11ビット、仮数52ビット。
Decimal Value
3.141592653589793
Float32 Hex
0x40490FDB
Float64 Hex
0x400921FB54442D18
詳細な説明
IEEE 754倍精度は、C/C++/Javaではdoubleとして知られ、JavaScriptとPythonではデフォルトの数値型です。単精度よりもはるかに大きな範囲と精度で浮動小数点値を表現するために64ビットを使用します。
64ビットレイアウト:
| フィールド | ビット数 | 位置 |
|---|---|---|
| 符号 | 1ビット | ビット63 |
| 指数 | 11ビット | ビット62-52 |
| 仮数 | 52ビット | ビット51-0 |
円周率(Pi = 3.14159...)の格納方法:
数学定数Piは有限のバイナリフォーマットでは正確に表現できません。最も近い倍精度表現は:
- 符号 = 0(正)
- バイアス付き指数 = 1024(実際の指数 = 1024 - 1023 = 1)
- 仮数 = Pi/2 - 1に最も近い52ビットの小数部
格納される値は3.141592653589793で、真のPiとの差は約1.22e-16です。16進数表現は0x400921FB54442D18です。
倍精度が重要な理由:
- 15〜16桁の10進精度(float32の7桁に対して)
- 指数範囲は
-1022から+1023(float32の-126から+127に対して) - 最大値は約
1.80e+308(3.40e+38に対して) - 最小正規化値は約
2.23e-308
JavaScriptと倍精度:
JavaScriptのすべての数値はIEEE 754倍精度です。ネイティブの32ビット浮動小数点型はありません(ただしFloat32Arrayは型付き配列アクセスを提供します)。つまり、0.1 + 0.2のような式は64ビット算術を使用し、最大安全整数(Number.MAX_SAFE_INTEGER)は2^53 - 1 = 9007199254740991です。
メモリのトレードオフ:
倍精度は値あたり8バイトを使用しますが、単精度は4バイトです。数百万の値を処理するアプリケーション(科学シミュレーション、金融モデリング、データ分析)では、このメモリフットプリントの倍増は重大な影響を与える可能性があります。
ユースケース
倍精度は、科学計算、金融計算、Webアプリケーション(JavaScript)、データサイエンス(Python)、および7桁の10進精度では不十分なあらゆるドメインのデフォルトです。ほとんどの高水準言語の標準的な数値型です。