の ECMAScript 仕様にMath.pow
は、次の固有のルールがあります。
- x < 0 で x が有限で y が有限で y が整数でない場合、結果は NaN になります。
( http://es5.github.com/#x15.8.2.13 )
結果としてMath.pow(-8, 1 / 3)
与えるのNaN
ではなく-2
このルールの理由は何ですか?この規則には、ある種のより広範なコンピュータ サイエンスまたは IEEE 的な理由があるのでしょうか。
アップデート
アマダンのやり取りのおかげで、今は理屈が分かってきた気がする。後世のために議論を広げたいと思います。
次の例を見てみMath.pow(823543, 1 / 7)
ましょ6.999999999999999
う7
。これは、1 / 7
最初に を 10 進表現に変換する必要があり0.14285714285714285
、切り捨てられて精度が失われるという事実によって生じる不正確さです。正の数を扱っている場合、実際の結果に非常に近い結果が得られるため、これはそれほど悪い問題ではありません。
しかし、ネガティブな世界に足を踏み入れると、問題が発生します。JavaScript エンジンが計算しようとすると、最初に 10 進数Math.pow(-823543, 1 / 7)
に変換する必要があるため、実際には答えのない計算になります。この場合、実際の答えは であるはずなのに、実数を見つけることができなかったため、返さなければならない場合があります。さらに、「最良の推測」を行うために実数に近い複素数を探すことは、数学の分野で JS エンジンを必要としないレベルの複雑さを伴う場合があります。1 / 7
Math.pow(-823543, 0.14285714285714285)
NaN
-7
私の推測では、浮動小数点数の精度の損失を考慮した結果、負の数から非整数のべき乗は常にあるべきであるというルールに導かれたNaN
ためです。基本的に、非整数のべき乗は例えそうでなくても、精度が失われた結果として複素数になり、そこから回復する良い方法がないかもしれません。
これで私はかなり満足していますが、さらなる情報を歓迎します。