🎄
ENCA 14日目: Math.sqrt 精度の正確さ保証
数値計算精度の扱い
ECMAScript の数値計算の精度を表す言葉に implementation-approximated があります。これはなるべく正確な計算結果であるべきだが、仕様ではその正確さを保証しないことを表します。
多くの Math
函数が implementation-approximated となっています。詳しくは uhyo さんの記事が参考になります。
2014年に仕様で数値計算誤差を大きくても 1 ULP (Unit in the Last Place) に抑えようと調査されましたが結局実現出来ませんでした。その後2015年に CR-LIBM ライブラリを使うことでなんとか出来ないかと再度フォローアップ調査されましたが、これも実現出来ませんでした。
現在の仕様ではフリーで配布されている fdlibm アルゴリズムを使うことが推奨されていますが、強制力はなくあくまで実装者に委ねている状態です。
Math.sqrt
精度の正確さ保証
今日ではブラウザに実装されている JavaScript エンジンには全て WebAssembly が実装されており、その中に f64.sqrt
命令が入っています。また浮動小数点数の仕様である IEEE 754-2019 に squareRoot
命令について記載されており、どのエンジンも仕様に準拠するために正確な結果を返すようになっています。というわけで2024年7月に Math.sqrt
については implementation-approximated を辞め、精度の正確さを保証する変更が承認されました。
Discussion