Frage

Ich habe nachgeschlagen, was dies tut, aber hat jemand tatsächlich ein Beispiel, wenn Sie das strictfp Schlüsselwort in Java verwenden würde? Hat jemand tatsächlich eine Verwendung für diese gefunden?

Gäbe es irgendwelche Nebenwirkungen nur darum, es auf allen meinen Gleitkommaoperationen?

War es hilfreich?

Lösung

strictfp stellt sicher, dass Sie genau die gleichen Ergebnisse aus Ihren Gleitkommarechnungen auf jeder Plattform zu bekommen. Wenn Sie nicht strictfp verwenden, ist die JVM Implementierung frei zusätzliche Präzision zu verwenden, sofern verfügbar.

Vom JLS :

  

Im Rahmen eines FP-strengen Ausdruck, alle   Zwischenwerte müssen Elemente sein   des Schwimmers Wert eingestellt oder Doppel   Wert festgelegt, was bedeutet, dass die Ergebnisse   alle FP-strengen Ausdrücke müssen sein   diejenigen, vorhergesagt von IEEE 754-Arithmetik   auf Operanden dargestellt mit Single   und Doppel Formate. im Rahmen eines   Ausdruck, der nicht FP-streng, einig   Spielraum für eine gewährte   Implementierung einer erweiterten zu verwenden   Exponent Bereich darzustellen   Zwischenergebnisse; der Nettoeffekt,   grob gesagt, ist, dass ein   Berechnung könnte produzieren „die richtige   Antwort“in Situationen, in denen exklusive   Verwendung des Schwimmers Wertesatz oder Doppel   Wertemenge könnte in Überlauf führen oder   Unterschreitung.

Mit anderen Worten, es geht um sicher zu machen, dass Write-Once-Run-Anywhere- bedeutet eigentlich Write-Once-Get-Gleichermaßen-Wrong-Ergebnis-überall .

Mit strictfp Ihre Ergebnisse sind tragbar, ohne dass es sie eher genau sein.

Andere Tipps

Wikipedia hat eigentlich einen guten Artikel zu diesem Thema hier , mit einem Link zu der Java-Spezifikation .

zwischen den Zeilen lesen, ist die Implikation, dass, wenn Sie nicht strictfp angeben, dann wird die JVM und JIT-Compiler-Lizenz haben Ihre Gleitkommarechnungen aber sie möchten, zu berechnen. Im Interesse der Geschwindigkeit, werden sie höchstwahrscheinlich die Berechnung auf Ihren Prozessor übertragen. Mit strictfp auf, müssen die Berechnungen entsprechen 754 Arithmetik-Standards IEEE, was in der Praxis bedeutet dies wahrscheinlich, dass die JVM wird die Berechnung tun.

Also warum sollten Sie strictfp benutzen? Ein Szenario, das ich sehen kann, ist in einem verteilten Anwendung (oder Multiplayer-Spiel), in der alle Gleitkommarechnungen deterministisch sein müssen, egal, was die zugrunde liegende Hardware oder CPU ist. Was ist der Trade-off? Wahrscheinlich Ausführungszeit.

Es begann alles mit einer Geschichte,

Wenn Java wurde von James Gosling, Herbert und Rest seines Teams entwickelt. Sie hatten diese verrückte Sache im Auge namens Plattformunabhängigkeit . Sie wollten machen Eiche (Java) so viel besser, dass es laufen würde genau gleiche auf jeder Maschine verschiedenen Befehlssatz, auch mit unterschiedlichen Betriebssystemen. Aber es gab ein Problem mit Kommazahlen auch als Floating-Point bekannt und Doppel in Programmiersprachen. Einige Maschinen zielten Effizienz gebaut, während Rest Genauigkeit zielten. Also, die später (genauer) Maschinen hatten eine Größe von Floating-Point als 80 Bits, während die früheren (effizienten / schneller) Maschinen 64 Bit verdoppelt hatten. Aber war dies gegen dort Kernidee eine plattformunabhängige Sprache aufzubauen. Auch dies zu einem Verlust der Genauigkeit / Daten führen könnte, wenn ein Code auf einiger Maschine gebaut wird (Doppel von 64-Bit-Größe) und läuft auf einem anderen Art von Maschine (Doppel von 80-Bit-Größe).

Up-Sizing kann toleriert werden, aber die Verkleinerung kann nicht sein. So stießen sie auf ein Konzept der strictfp d strengen Floating-Point . Wenn Sie das Schlüsselwort mit einer Klasse / Funktion dann seine Floating-Point-und Doppelzimmer haben eine einheitliche Größe auf jeder Maschine. das heißt 32/64 Bit ist.

Hier sind einige Referenzen:

  • Mit strictfp (JDC Tech Tip)
  • jGuru: Was ist der strictfp Modifikator für? Wenn ich würde es in Betracht ziehen?

      

    Im Grunde, was es läuft darauf hinaus, ob Sie darauf, dass die Ergebnisse des Floating-Point-Ausdrücke in Ihrem Code sind schnell oder vorhersehbar. Wenn Sie die Antworten brauchen zum Beispiel, dass Ihr Code wird mit der bis verwendet Gleitkommawerte konsistent sein über mehrere Plattformen hinweg dann strictfp verwenden.

  • strictfp - Java Glossar

      

    Gleitkomma-Hardware berechnet mit mehr Präzision und mit einem größeren Wertebereich als die Java-Spezifikation erfordert. Es wäre verwirrend, wenn einige Plattformen als andere Präzision gab. Wenn Sie den strictfp Modifikator auf ein Verfahren oder eine Klasse zu verwenden, erzeugt der Compiler Code, der für identische Ergebnisse auf allen Plattformen strikt an die Java-Spezifikation hält. Ohne strictfp ist es etwas laxen, aber nicht so lax wie die Guard-Bits in dem Pentium verwendet 80 Bit Genauigkeit zu geben.

  • Und schließlich die eigentliche Java Language Specification, §15.4 FP-strenge Ausdrücke :

      

    Im Rahmen eines FP-strengen Ausdruck, alle Zwischenwerte müssen Elemente des Schwimmers Wert gesetzt oder Doppel Wert eingestellt werden, was bedeutet, dass die Ergebnisse aller FP-strengen Ausdrücke müssen diejenigen, die durch IEEE 754-Arithmetik dargestellt auf Operanden vorhergesagt werden unter Verwendung von Single und Doppel Formate. Innerhalb von einem Ausdruck, der nicht FP-streng ist, wird ein gewisser Spielraum für eine Implementierung gewährt einen erweiterten Exponenten Bereich verwenden Zwischenergebnisse darstellen; der Nettoeffekt, grob gesagt, ist, dass eine Berechnung „die richtige Antwort“ in Situationen, in denen die ausschließliche Verwendung des float-Wertes gesetzt oder doppelten Wert Satz in Über- oder Unterlauf könnte zur Folge erzeugen könnte.

Ich habe noch nie persönlich eine Verwendung für sie, though.

Wie die anderen Antworten erwähnt es die Zwischen Gleitkommaergebnisse dazu führen, die IEEE-Spezifikation zu entsprechen. Insbesondere x86-Prozessoren können Zwischenergebnisse speichern mit unterschiedlicher Genauigkeit von der IEEE-Spezifikation. Die Situation wird noch komplizierter, wenn der JIT-Compiler eine bestimmte Berechnung optimiert; die Reihenfolge der Befehle anders sein könnte jedes Mal in etwas anderen Rundung zur Folge hat.

Der Aufwand von strictfp abzeichnet sehr Prozessor und JIT abhängig sein. Dieser Wikipedia-Artikel über SSE2 scheint einen kleinen Einblick in das Problem zu haben. Also, wenn der JIT kann SSE-Befehle erzeugen, um eine Berechnung durchführt es scheint, dass strictfp wird keinen Overhead.

In meinem aktuellen Projekt gibt es ein paar Orte, an denen ich strictfp verwenden. Es gibt einen Punkt, an dem Potential der kosmischen Strahlung müssen von Pixelwerten entfernt werden. Wenn einige außerhalb Forscher den den gleichen Pixelwert und die kosmische Strahlung vor sich haben, sollen sie den gleichen Ergebniswert wie unsere Software.

  • strictfp ist ein Modifizierungsmittel, das nach IEEE 754-Fließkommaberechnungen einschränkt.

  • Dies kann wie „public strictfp Klasse StrictFpModifierExample {}“ oder Methode „public strictfp void Beispiel ()“ auf ganzer Klasse verwendet werden. Wenn es auf Klasse als alle Methoden verwendet wird, folgen IEEE 754 und falls vorhanden auf Verfahren dann werden bestimmte Methode IEEE folgen 754.

  • Warum es verwendet wird ?? ::: Da unterschiedliche Plattformen haben unterschiedliche Gleitkomma-Hardware, die mit mehr Präzision und einem größeren Wertebereich berechnet als die Java-Spezifikation erfordert, die auf diffrent diffrent Ausgabe erzeugen kann plateforms.so es die gleiche Leistung bestätigt, unabhängig von diffrent plateforms

  • strictfp gewährleistet auch die Vorteile der Geschwindigkeit und Präzision der erweiterten Präzision Gleitkommaoperationen zu nehmen.

  • Es gibt keinen Nachteil mit diesem Begriff wir verwenden können, wenn wir Fließkommaberechnungen

  • tun
  • Mein letzter Punkt ist --Was IEEE754 kurz ist IEEE 754 definiert Standardmethode für beide Gleitkomma-Berechnungen und die Speicherung von in Fließkommawerte entweder einzelne (32-Bit, verwendet in Java floats) oder doppelt (64-Bit, verwendet in Java verdoppelt) precision.It definiert auch Normen für Zwischenberechnungen und für erweiterte Präzision Formate.

strictfp ist ein Schlüsselwort, und kann als nicht Nicht Zugriffsmodifikator für Klassen oder ein Verfahren (aber nie Variablen) verwendet werden. eine Klasse als strictfp Kennzeichnung bedeutet, dass jede Methode Code in der Klasse zu den IEEE 754-Standard-Regeln für Gleitpunkte anpaßt.

Ohne diesen Modifikator, floating Punkte in den verwendeten Methoden können in einer plattformabhängigen Art und Weise verhalten. Mit ihm können Sie vorhersagen, wie Ihr Gleitpunkte verhalten wird, unabhängig von der zugrunde liegenden Plattform die JVM auf ausgeführt wird. Der Nachteil ist, dass, wenn die zugrunde liegende Plattform unterstützt eine höhere Präzision der Lage ist, wird ein strictfp Verfahren nicht in der Lage sein, die Vorteile daraus zu ziehen.

Wenn Sie nicht eine Klasse als strictfp erklären, man kann immer noch strictfp Verhalten auf einer Methode-by-Methode Grundlage erhalten, durch ein Verfahren, wie strictfp erklärt.

~ SCJP Sun®Certified Programmierer für Java ™ 6 - Kathy Sierra und Bert Bates ~

Mai unter Beispiel Hilfe beim Verständnis dieser mehr klar: In Java, wann immer wir verwenden suchen präzise Informationen für jeden Betrieb z.B.             wenn wir das tun Doppel num1 = 10e + 102; Doppel num2 = 8e + 10;                 Ergebnis = num1 + num2;

        The output will be so long and not precise, becasue it is precissed by the hardware e.g JVM and JIT has the license 
        as long as we dont have specify it Strictfp

Marking it Strictfp will make the result Uniform on every hardware and platform, because its precised value will be same
One scenario I can see is in a distributed application (or multiplayer game) where all floating-point calculations need to 
be deterministic no matter what the underlying hardware or CPU is.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top