タイトルの通りなのですが、なぜかとある条件のべき乗を計算するとNaNが返ってくるので不思議に思って調べてみました(調べてくれたのは神谷)。
その条件は、基数が負なおかつ指数が分数 であること。
たとえば (-8)**(2/3)
という計算は、答えは 4
なのですが、JSで計算をするとNaNが返ります。
(-8)**(2/3) // NaN
一体全体何が起きているのか?
答えは MdNのMath.powのページ に書いてありました。
// due to "even" and "odd" roots laying close to each other,
// and limits in the floating number precision,
// negative bases with fractional exponents always return NaN
最初の一行の意味はわからなかったのですが、要するに浮動小数点の精度の問題で 基数が負なおかつ指数が分数のときは静的にNaNを返すのがJSの仕様 ということみたいです
実際にMath.powで同じことをしても結果はNaNでした。
Math.pow(-8, 2/3) // NaN
試しに、指数の分数を分解して (3√(-8))^2
で計算してみると
Math.pow(Math.cbrt(-8), 2) // 4
正しく4が返ります。
そういえば、正の数の平方根の計算結果って±になりますよね。
√4
の答えは ±2
と学校で習った記憶がある。
Math.sqrt(4) // 2
この辺の計算って結構曖昧なのかもしれません