IEEE 754 倍精度フォーマット

JavaScript、Python、ほとんどの現代言語で使用される64ビット倍精度IEEE 754フォーマットを探索。符号1ビット、指数11ビット、仮数52ビット。

Fundamentals

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は有限のバイナリフォーマットでは正確に表現できません。最も近い倍精度表現は:

  1. 符号 = 0(正)
  2. バイアス付き指数 = 1024(実際の指数 = 1024 - 1023 = 1)
  3. 仮数 = Pi/2 - 1に最も近い52ビットの小数部

格納される値は3.141592653589793で、真のPiとの差は約1.22e-16です。16進数表現は0x400921FB54442D18です。

倍精度が重要な理由:

  • 15〜16桁の10進精度(float32の7桁に対して)
  • 指数範囲-1022から+1023(float32の-126から+127に対して)
  • 最大値は約1.80e+3083.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進精度では不十分なあらゆるドメインのデフォルトです。ほとんどの高水準言語の標準的な数値型です。

試してみる — IEEE 754 Inspector

フルツールを開く