Ich habe die JVM-Spezifikation für den fpstrict
-Modifizierer verstehe aber immer noch nicht ganz, was es bedeutet.
Kann mich jemand aufklären?
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:
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.
Ich mag diese Antwort, die auf den Punkt trifft:
Es stellt sicher, dass Ihre Berechnungen auf allen Plattformen gleichermaßen falsch sind.
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.
Tags und Links java floating-point