九州・福岡・東京ときどきIoT

21年間のはてなダイアリー&アメブロからの避難所

マジックナンバー0x5f3759df の導き方について

0x5f3759df
は、ビット操作と対数の性質を組み合わせた非常に巧妙な近似手法によって導き出されます。この数値は、計算の誤差を最小化するために、数式による解析と経験的な調整によって最適化されました。 
以下に、導出の主要なステップをまとめます。 
1. 浮動小数点数の表現を利用する 
このアルゴリズムの核となるのは、IEEE 754形式の32ビット浮動小数点数float)を、そのビットパターンをそのまま32ビット整数(long)として解釈するというアイデアです。 
IEEE 754形式では、32ビット浮動小数点数
xx
は、符号ビット
Scap S
、指数部
Ecap E
仮数
Mcap M
に分けられ、その値は以下の式で表されます。 
x=(-1)S(1+M)2EBx equals open paren negative 1 close paren to the cap S-th power center dot open paren 1 plus cap M close paren center dot 2 raised to the cap E minus cap B power
ここで、
Bcap B
はバイアス値(32ビット浮動小数点数の場合は127)です。 
2. 対数に変換して近似する 
平方根
y=1/xy equals 1 / the square root of x end-root
の両辺の2を底とする対数をとります。 
log2(y)=log2(x-1/2)=12log2(x)log base 2 of y equals log base 2 of open paren x raised to the negative 1 / 2 power close paren equals negative one-half log base 2 of x
ここで、浮動小数点数を整数にキャストする操作が、この対数変換を近似する役割を果たします。浮動小数点数を整数として見なすと、その値は指数部と仮数部を使って以下のように近似できます。 
IxLlog2(x)+Ccap I sub x is approximately equal to cap L center dot log base 2 of x plus cap C
ここで、
Ixcap I sub x
xx
を整数として解釈した値、
L=223cap L equals 2 to the 23rd power
仮数部のビット数、
Ccap C
は定数です。
同様に、
yy
についても以下の式が成り立ちます。 
IyLlog2(y)+Ccap I sub y is approximately equal to cap L center dot log base 2 of y plus cap C
これらの関係式を最初の対数式に代入して整理すると、以下のような関係式が導かれます。 
Iy32L(Bσ)12Ixcap I sub y is approximately equal to three-halves cap L open paren cap B minus sigma close paren minus one-half cap I sub x
ここで、
B=127cap B equals 127
(バイアス値)、
は、対数近似の誤差を最小化するために導入された補正項です。 
導出された関係式は、次のようなビット操作に相当します。 
IyR(Ix1)cap I sub y is approximately equal to cap R minus open paren cap I sub x is much greater than 1 close paren
ここで、>> 1は1ビット右シフトで、
12Ixone-half cap I sub x
を意味します。
Rcap R
32L(Bσ)three-halves cap L open paren cap B minus sigma close paren
の部分であり、これがマジックナンバーの候補となります。 
L=223cap L equals 2 to the 23rd power
B=127cap B equals 127
を代入すると、 
R32223(127σ)cap R is approximately equal to three-halves center dot 2 to the 23rd power open paren 127 minus sigma close paren
この式から、
の値を調整することで、R の値が変わります。 
  • 数式から導かれる理論値:
    の最適値として0.0450466などが導かれます。
  • 経験的調整: 最終的なマジックナンバー0x5f3759dfは、すべての浮動小数点数における相対誤差を最小化するように、経験的に微調整されました。 
4. ニュートン法による最適化 
このビット操作による初期近似値は、ニュートン法を1回適用することで、さらに精度が向上します。
y=y(1.5fxhalfyy)y equals y center dot open paren 1.5 f minus x sub h a l f end-sub center dot y center dot y close paren
この一連のステップにより、当時の一般的な方法よりもはるかに高速に逆平方根を計算することが可能になったのです。 
結論 
マジックナンバー0x5f3759dfは、偶然発見されたものではなく、浮動小数点数の内部表現と対数の性質を巧みに利用した数式から、厳密に導出された値です。そして、その精度を最大化するために、多数の浮動小数点数でテストされて最適化された、理論と実践が融合した結果なのです。