Math.pow mit negativen zahlen und nicht-ganzzahlige Potenzen

Der ECMAScript-Spezifikation für Math.pow hat folgende eigenartige Regel:

  • Wenn x < 0 und x endlich ist und y endlich ist und y ist keine ganze Zahl, ist das Ergebnis NaN.

(http://es5.github.com/#x15.8.2.13)

Als Ergebnis Math.pow(-8, 1 /3) gibt NaN eher als -2

Was ist der Grund für diese Regel? Gibt es irgendeine Art von breiteren informatik oder IEEEish Grund für diese Regel, oder ist es nur eine Wahl TC39/Eich aus once upon a time?


Update

Dank Amadan ist der Austausch mit mir, ich glaube, ich verstehe die Argumentation jetzt. Ich möchte erweitern auf unsere Diskussion zum Wohle der Nachwelt.

Nehmen wir das folgende Beispiel: Math.pow(823543, 1 /7) Erträge 6.999999999999999 obwohl es wirklich so sein sollte 7. Dies ist eine Ungenauigkeit eingeführt durch die Tatsache, dass 1 /7 müssen zunächst konvertiert werden, um eine dezimale Darstellung 0.14285714285714285, die abgeschnitten und verliert an Präzision. Das ist nicht so eine schlechte problem, wenn wir arbeiten mit positiven zahlen, denn wir bekommen immer noch ein Ergebnis, das sehr nahe am realen Ergebnis.

Sobald wir jedoch den Schritt in die negative Welt, in der wir ein problem haben. Wenn eine JavaScript-engine wurden, um zu versuchen, um zu berechnen Math.pow(-823543, 1 /7) würde es zuerst konvertieren zu müssen 1 /7 in eine Dezimalzahl, so wäre es wirklich computing Math.pow(-823543, 0.14285714285714285) die eigentlich hat keine wirkliche Antwort. In diesem Fall kann es zurück NaN da Sie nicht finden konnte eine reelle Zahl, obwohl die eigentliche Antwort sollte -7. Darüber hinaus, auf der Suche nach komplexen zahlen, die nahe an den realen zahlen, um einen "best guess" kann bedeuten, eine Ebene der Komplexität, die Sie nicht möchten, dass eine JS-engine zu haben, die in der Mathe-arena.

Meine Vermutung ist, es ist aufgrund der Berücksichtigung des Verlust der Genauigkeit bei floating-point-zahlen, führte Sie zu der Regel, dass negative zahlen eine nicht-ganzzahlige Potenz sollte immer NaN - im Grunde, weil ein nicht-integer-Leistung ist wahrscheinlich zu geben, eine komplexe Zahl, die als Folge von Verlust an Präzision, auch wenn es nicht sollte, und es kann kein guter Weg, um sich zu erholen.

Mit diesem bin ich ziemlich zufrieden, aber ich begrüße weitere Informationen.

InformationsquelleAutor Nathan Wall | 2013-01-29
Schreibe einen Kommentar