🎄

ENCA 14日目: Math.sqrt 精度の正確さ保証

2024/12/16に公開

数値計算精度の扱い

ECMAScript の数値計算の精度を表す言葉に implementation-approximated があります。これはなるべく正確な計算結果であるべきだが、仕様ではその正確さを保証しないことを表します。

多くの Math 函数が implementation-approximated となっています。詳しくは uhyo さんの記事が参考になります。

https://zenn.dev/uhyo/articles/javascript-math-accuracy

2014年に仕様で数値計算誤差を大きくても 1 ULP (Unit in the Last Place) に抑えようと調査されましたが結局実現出来ませんでした。その後2015年に CR-LIBM ライブラリを使うことでなんとか出来ないかと再度フォローアップ調査されましたが、これも実現出来ませんでした。

https://github.com/tc39/ecma262/issues/3347#issuecomment-2161705091

現在の仕様ではフリーで配布されている fdlibm アルゴリズムを使うことが推奨されていますが、強制力はなくあくまで実装者に委ねている状態です。

https://tc39.es/ecma262/multipage/numbers-and-dates.html#sec-function-properties-of-the-math-object

Math.sqrt 精度の正確さ保証

今日ではブラウザに実装されている JavaScript エンジンには全て WebAssembly が実装されており、その中に f64.sqrt 命令が入っています。また浮動小数点数の仕様である IEEE 754-2019squareRoot 命令について記載されており、どのエンジンも仕様に準拠するために正確な結果を返すようになっています。というわけで2024年7月に Math.sqrt については implementation-approximated を辞め、精度の正確さを保証する変更が承認されました。

https://github.com/tc39/ecma262/pull/3345

Discussion