13

の 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.9999999999999997。これは、1 / 7最初に を 10 進表現に変換する必要があり0.14285714285714285、切り捨てられて精度が失われるという事実によって生じる不正確さです。正の数を扱っている場合、実際の結果に非常に近い結果が得られるため、これはそれほど悪い問題ではありません。

しかし、ネガティブな世界に足を踏み入れると、問題が発生します。JavaScript エンジンが計算しようとすると、最初に 10 進数Math.pow(-823543, 1 / 7)に変換する必要があるため、実際には答えのない計算になります。この場合、実際の答えは であるはずなのに、実数を見つけることができなかったため、返さなければならない場合があります。さらに、「最良の推測」を行うために実数に近い複素数を探すことは、数学の分野で JS エンジンを必要としないレベルの複雑さを伴う場合があります。1 / 7Math.pow(-823543, 0.14285714285714285)NaN-7

私の推測では、浮動小数点数の精度の損失を考慮した結果、負の数から非整数のべき乗は常にあるべきであるというルールに導かれたNaNためです。基本的に、非整数のべき乗は例えそうでなくても、精度が失われた結果として複素数になり、そこから回復する良い方法がないかもしれません。

これで私はかなり満足していますが、さらなる情報を歓迎します。

4

2 に答える 2

4

これらの状況が結果を複雑な水域に導き、ECMAScript が虚数を備えていないためだと思います。1 + 1.732i具体的には、あなたの例は、他の結果の中でも、に近いものになるはずです。(-2 も可能な結果であるという事実は、要点とは別に、規則ではなく偶然です。)

于 2013-01-29T04:35:45.147 に答える
2

ヘルパー関数を使用できます。

迅速に私は同様の状況に直面しました。提案された解決策は次のとおりです。

function checkSquareRoot(x, y) {
    if (x > 0) {
        return Math.pow(x, y)
    }
    return -1 * Math.pow(-x, y)
}
于 2015-10-04T05:10:32.060 に答える