浮動小数点精度の限界
調べること
シェーダーでアニメーションや音声信号を扱っていると浮動小数点の精度が気になることがあるけど、結局限界ってどんな感じなんだっけを調べる 参考文献
浮動小数点の仕組み
$ {\rm value} = (-1)^{\rm sign} \times 2^{\rm exponent} \times {\rm mantissa}
$ \rm exponentは指数部で表現できる値の半分の値でバイアスを掛ける
$ \rm mantissaは1(含む)から2(含まず)までの実数の小数部分を決める(説明むず)
精度
$ 2^n間隔を正しく表現できるのは$ 2^{(n + 仮数部ビット + 1)}
たとえば、$ 2^{\rm (仮数部ビット数 + 1)} までは整数が正しく表現可能
精度ごと
各精度ごとに、以下を見てみる
整数精度を保証
60Hz精度を保証
カメラが60フレで動くかな
$ 2^{-6} < \frac{1}{60} < 2^{-5}なので$ 2^{-6}精度を見る
48,000Hz精度を保証
音で使えるかな
$ 2^{-16} < \frac{1}{48000} < 2^{-15}なので$ 2^{-16}精度を見る
fp64(倍精度)
ビット内訳
符号1bit
指数13bit
仮数52bit
生息地
限界
整数精度を保証
$ 2^{53} = 9,007,199,254,740,992 \approx 9.007 \times 10^{15}まで
https://gyazo.com/d61bda75565590275e307628e5ed1a67
64bit signed intの最大値が$ 9,223,372,036,854,775,807 \approx 9.223 \times 10^{18}
60Hz精度を保証
$ 2^{47} = 140,737,488,355,328 \approx 1.407 \times 10^{14}まで
48,000Hz精度を保証
$ 2^{37} = 137,438,953,472 \approx 1.374 \times 10^{11}まで
fp32 (単精度)
ビット内訳
符号1bit
指数8bit
仮数23bit
生息地
だいたいのGPUのシェーダ、highp
一部GPUのシェーダ、mediump
Time.timeでインスタレーションモノをやるとすぐ限界が来るなんてのはよく聞く
限界
整数精度を保証
$ 2^{24} = 16,777,216まで
0xffffffがもうすでに限界。結構しんどい
60Hz精度を保証
$ 2^{18} = 262,144まで
262,144秒 = 72.82時間
例えば100.0 * timeとかすると、43分で限界が来る。ライブコーディングではやばいかも
48,000Hz精度を保証
$ 2^{8} = 256まで
TAU * 440.0 * timeは0.09秒で限界。ウソでしょ
fp16(半精度)
ビット内訳
符号1bit
指数5bit
仮数10bit
生息地
一部GPUのシェーダ、mediump
PowerVR
𝒊𝑷𝒉𝒐𝒏𝒆
今は違うのかな。要調査
限界
整数精度を保証
$ 2^{11} = 2,048まで
60Hz精度を保証
$ 2^{5} = 32まで
48,000Hz精度を保証
$ 2^{-5} = 0.03125まで
草
シェーダで実験してみた
上で挙げた限界に達さずとも、そもそも動きはするが動きがフレーム間で等間隔でなくキモいやつになる
関連する記事