JavaScript steht für Zahlen wie IEEE 754, die deterministisch sind. Unterdessen habe ich Argumente gesehen, dass einige Compiler-Optimierungen die Reihenfolge der Fließkommaoperationen ändern können, was zu Nicht-Determinismus in verschiedenen Läufen führt. Die Frage ist also: Verwenden Sie keine andere Quelle für Nicht-Determinismus (Math.random
, usw.), wird eine Number -> Number
JavaScript-Funktion immer dasselbe Ergebnis unabhängig von Plattform und Engine erzeugen?Sind JavaScript-Zahlen deterministisch?
Antwort
Nehmen wir an, Sie beziehen sich auf sprachspezifische Nicht-Determinismen, anstatt irgendetwas IEEE-754-spezifisch.
Viele andere Sprachen, wie C
haben undefined
oder implementation-specific
Verhalten, die der Compiler für diesen Prozessor zu emittieren sehr engen Code erlaubt, aber auf Kosten einer guten Anzahl von gotchas.
Zum Beispiel in der C
Sprache dieser Ausdruck:
(a++) + (++a)
kann auf zwei verschiedene Aufträge bewertet werden und Sie können zwei gültige Antworten erhalten.
In EcmaScript 3 (und 5) geben Sie jedoch die Reihenfolge der Operationen für Ausdrücke an, damit jede JavaScript-Plattform genau die gleiche Funktion hat.
Es ist eine längere Diskussion hier:
einige Compiler-Optimierungen, die Reihenfolge der Gleitkomma-Operationen ändern können, bringen nicht-Determinismus in den verschiedenen Läufen
Die ECMAScript-Spezifikation diskutiert solche Optimierungen nicht. Im Allgemeinen wird jedoch erwartet (wie es für einige Algorithmen TypedArray
explizit notifiziert wird), dass "Optimierung keine beobachtbaren Änderungen im angegebenen Verhalten des Algorithmus einführen darf." Und die Reihenfolge der Auswertung für Operatoren ist ziemlich genau in ECMAScript spezifiziert.
Also wenn nicht bewiesen, falsch durch eine Implementierung, die solche Sachen (und deren Standard-Compliance würde noch bestimmt werden müssen), können wir annehmen, dass die Antwort Ja ist.
"Ja." JavaScript ist so spezifiziert, dass es eine IEEE 754-Doppelsemantik für Zahlen hat, und es hat eine wohldefinierte Reihenfolge aller mathematischen Operationen (aus sprachsemantischer Sicht), wo alle Zwischenwerte mit Genauigkeit materialisiert werden müssen. Wenn es eine Plattform/Engine gibt, die nicht enthalten ist, entspricht sie nicht der ECMAScript-Spezifikation. – user2864740
@ user2864740: Die Spezifikation setzt voraus, dass 'Math.log',' Math.sin', 'Math.cos', etc. nicht korrekt gerundet werden müssen. Jeglicher Code, der diese verwendet, führt wahrscheinlich nicht zu identischen Ergebnissen auf allen Plattformen. –
@MarkDickinson könnten Sie Ihren Punkt in einer Antwort ausarbeiten und beziehen? – MaiaVictor