浮動小数点 とは?
浮動小数点って何?
コンピュータが実数(小数を含む数)を表現する方法。例えば「1.23×10²」のように「仮数(1.23)× 基数(10)の指数(2)乗」の形で数を表す。非常に大きな数(宇宙の星の数)や小さな数(原子の質量)まで表現できる。
0.1+0.2が0.3にならないのはなぜ?
コンピュータは2進数で数を表現するため。10進数の0.1は2進数では0.000110011…と循環小数になって正確に表せない。だから0.1と0.2を足すと微妙な誤差が累積して0.30000000000000004になる。どの言語でも同じ問題が起きる(IEEE 754規格のため)。
お金の計算はどうするの?
金額計算にfloatやdoubleを使ってはいけない。1円の誤差が命取り。代わりにDecimal型(10進数で正確に表せる固定小数点数)を使う。JavaはBigDecimal、PythonはDecimalモジュール、JavaScriptなら整数(銭単位)で計算するなどの対策が必要。
浮動小数点の誤差でバグが起きた有名な事例ってあるの?
1991年の湾岸戦争でパトリオットミサイルの時刻計算に浮動小数点誤差が蓄積し、0.34秒のズレが生じてスカッドミサイルの迎撃に失敗、28人が死亡した事故が有名だよ。0.1秒を2進数で正確に表せないことが原因だったんだ。
NaN(Not a Number)って何なの?
「数値として表現できない結果」を表す特殊な値。0÷0やMath.sqrt(-1)の結果がNaN。面白いのはNaN === NaN がfalseになること。自分自身と等しくない唯一の値だよ。NaNのチェックにはisNaN()やNumber.isNaN()を使う。浮動小数点の仕様(IEEE 754)で明確に定義されている特殊値なんだ。