Frage

Ich weiß, dass dies eine doppelte Frage ist. Aber ich möchte es mit einem Beispiel wissen. Kann es also jemand mit einem Beispiel erklären?

Link zum doppelten Beitrag: Wann sollte ich das Schlüsselwort "strictfp" in Java verwenden?

War es hilfreich?

Lösung

Nun, Girinies Antwort fasst es gut zusammen, aber wenn Sie nach einem Beispiel suchen.

Nehmen wir an, Sie haben ein Spiel erstellt, das HighScore -Einreichungen ermöglicht, jedoch erst, nachdem der Server die Punktzahl bestätigt hat. Eine Methode zur Validierung der Punktzahl besteht darin, dass der Client die Tastendressuren (und seine Zeitstempel) an den Server sendet. Idealerweise würde der Server das genaue Spiel durchspielen und dieselbe Punktzahl erhalten.

Nehmen wir nun an, Ihr Spiel hat eine Physik, die das Ergebnis des Spiels verändern kann (z. B. eine Explosion, die zufällige Trümmer wirft, die Sie verletzen könnte, wenn es trifft).

Die Physik dieses Spiels könnte möglicherweise auf dem Server unterschiedlich sein (auch wenn es nur geringfügig ist) als der Client (z. B. wenn es bei der Konvertierung in Ganzzahlen zur Kollisionserkennung konvertiert wurde, wurde es abgerundet Nieder Anstatt von hoch). In einem solchen Edge -Fall könnten Sie eine Situation haben, in der das Kundenspiel war nicht Klicken Sie auf die Explosion von Trümmern, aber das Serverspiel war - Und jetzt haben Sie einen Unterschied in der Punktzahl, was eine HighScore -Einreichung falsch ungültig machen könnte

Während strictfp ist sicherlich keine Silberkugel, es ist ein langer Weg, um eine gewisse Konsistenz der "Wiederholung" von Anweisungen auf verschiedenen Plattformen aufzuerlegen.

Andere Tipps

Das ist was das Java Language Spec sagt:

Innerhalb eines FP-St-St-St-St-St-St-St-St-St-St--- . Innerhalb eines Ausdrucks, der nicht FP-Strikt ist, wird für eine Implementierung ein gewisses Spielraum gewährt, um einen erweiterten Exponentenbereich zu verwenden, um Zwischenergebnisse darzustellen. Der Nettoeffekt ist grob gesagt, dass eine Berechnung "die richtige Antwort" in Situationen erzeugt, in denen die ausschließliche Verwendung des Float -Werts oder des Doppelwertssatzes zu Überlauf oder Unterströmung führen kann.

Was das bedeutet, ist Folgendes: Gleitkomma -Arithmetik (dh Berechnungen mit dem betreffen die float und double Typen) in Java wird angegeben, um sich an die zu halten IEEE 754 Standard, der genau sagt, wie man FP -Zahlen darstellt. Das Problem ist, dass moderne CPUs intern die FP -Arithmetik verwenden, die nicht an diesem Standard für Zwischenergebnisse hängt - dies ist im Allgemeinen kein Problem, da es tatsächlich beide schneller ist und genauere Ergebnisse erzielt. Es könnte jedoch bedeuten, dass ein Programm etwas unterschiedliche Ergebnisse liefert, je nachdem, auf welcher Hardware es ausgeführt wird - was gegen das grundlegende Versprechen der Plattformunabhängigkeit von Java steht.

Das strictfp Mit dem Schlüsselwort können Sie sicherstellen, dass dieses Versprechen aufbewahrt wird und das Programm genau das gleiche Ergebnis hat, unabhängig davon, wo es ausgeführt wird - dies ist jedoch auf Kosten einer geringeren Leistung bei Hardware, bei denen zusätzliche Anstrengungen aufgewendet werden müssen, um die FP -Berechnungen einzuhalten IEEE 754 über alle Zwischenergebnisse.

Meistens haben Sie Rahter eine bessere Leistung als garantierte identische Ergebnisse auf Plattformen, und deshalb haben strictfp Verhalten ist optional. Eigentlich war es gemacht Optional in Java 1.4, nachdem JVM -Implementierer erkannt hatten, dass sie die CPU dazu bringen mussten, zusätzliche Arbeit zu machen, um sich an die Spezifikation zu halten, wenn die meiste Zeit eine solche strikte Einhaltung keine Vorteile hatte.

strictfp ist etwas ganz Besonderes.

Mit einem sehen lassen Ein Beispiel für die Weltraumagentur.

Der geschriebene Code verwendet sehr spezifische wissenschaftliche Zahlen, jetzt sind diese Zahlen in Mehrfach platzierte Dezimalstellen.

Diese Dezimalzimalwerte wirkt sich auf die Flugbahn aus des Weltraumschiffwegs, der durch meine Konstanten wie Reibung, Schwerkraft, Wärme, Feuchtigkeit, Sonnenstrahlen, Elektrizität erzeugt, multipler Gravitationskörper, Geschwindigkeit, Rauch effizient ist.

Der Hauptpunkt ist, dass wenn die Daten zur Bewertung gesendet werden, um das Schiff zu verfolgen Sollte den Wert zurückgeben, der für eine andere Plattform gleich ist Andernfalls erhalten wir Daten, die sich im Dezimalwert geringfügig unterscheiden.

Dies gilt jedoch nicht als kleiner Unterschied, da es dazu führt, dass das Schiff von seiner Flugbahn umgeleitet wird. Denken Sie daran Die Berechnung muss für eine andere Plattform sehr spezifisch und konsistent sein.

Für diese Anforderung haben wir Strictfp in Java.

Sie möchten, dass ein Programm es demonstriert, Es ist schwierig, dies genau mit einem kleinen Programm zu zeigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top