Was macht fpstrict in Java?

8

Ich habe die JVM-Spezifikation für den fpstrict -Modifizierer verstehe aber immer noch nicht ganz, was es bedeutet.

Kann mich jemand aufklären?

    
Yuval Adam 24.03.2010, 09:00
quelle

3 Antworten

11

Grundsätzlich müssen die Berechnungen mit den betroffenen Variablen float und double der Spezifikation IEEE 754 entsprechen, einschließlich der Zwischenergebnisse.

Dies hat die Wirkung von:

  • Sicherstellen, dass dieselbe Eingabe auf allen Systemen immer genau das gleiche Ergebnis erzeugt
  • Die CPU muss eventuell etwas mehr arbeiten, was sie etwas langsamer macht
  • Die Ergebnisse werden in einigen Fällen weniger genau sein (im Extremfall viel weniger)

Bearbeiten: Insbesondere verwenden viele moderne CPUs intern eine 80-Bit-Fließkomma-Arithmetik ( "extended precision" ). Daher können sie intern einige Zahlen in denormalisierter Form darstellen, die arithmetischen Überlauf oder Unterlauf (mit Unendlichkeit bzw. Null) in 32- oder 64-Bit-Gleitkommazahlen verursachen würden; In Grenzfällen erlaubt 80 Bit nur mehr Präzision. Wenn solche Zahlen als Zwischenergebnisse in einer Berechnung auftreten, aber mit einem Endergebnis im Bereich der Zahlen, die durch 32/64-Bit-Gleitkommazahlen dargestellt werden können, erhalten Sie ein "korrekteres" Ergebnis auf Maschinen, die 80-Bit-Gleitkommaarithmetik verwenden nicht - oder in Code, der strictfp verwendet.

    
Michael Borgwardt 24.03.2010, 09:09
quelle
6

Ich mag diese Antwort, die auf den Punkt trifft:

  

Es stellt sicher, dass Ihre Berechnungen auf allen Plattformen gleichermaßen falsch sind.

    
helpermethod 24.03.2010 11:03
quelle
2

strictfp ist ein Schlüsselwort und kann verwendet werden, um eine Klasse oder eine Methode zu ändern, aber niemals a Variable. Das Markieren einer Klasse als strictfp bedeutet, dass jeder Methodencode in der Klasse verwendet wird konform zu den IEEE 754 Standardregeln für Gleitkommazahlen. Ohne diesen Modifikator Gleitpunkte, die in den Methoden verwendet werden, können sich plattformabhängig verhalten.
Wenn Sie eine Klasse nicht als strictfp deklarieren, können Sie strictfp immer noch auf a anwenden Methode-für-Methode, indem eine Methode als strictfp deklariert wird.

Wenn Sie den IEEE 754 Standard nicht kennen, ist es nicht an der Zeit, ihn zu lernen. Sie haben, wie wir sagen, größere Fische zum Frittieren.

    
Sanjeev 24.03.2010 11:39
quelle

Tags und Links