2016-07-07 19 views
0

Die Sprache ist Java und die Maschine ist ein normaler PC mit einem Intel-Prozessor. Der Typ ist doppelt.Welche Rundungsmethode wird in Java verwendet, wenn mit Gleitkommazahlen gearbeitet wird?

Fließkommazahlen können nicht genau jede gebrochene Zahl darstellen, das Ergebnis der Operationen wie Division oder Subtraktion wird irgendwie auf eine Fließkommadarstellung gerundet.

Ich frage, ob die verwendete Rundungs ​​Strategie ist:

  1. Runden von Null weg
  2. Rundung gegen Null
  3. Richtung negativ unendlich Rundung
  4. auf positive Unendlichkeit Rundungs ​​
  5. Rundung auf die nächste (halb hoch)
  6. Rundung auf die nächste (halbe Tiefe)
  7. Rundung zur nächsten (die Hälfte sogar)
+1

Oft ist dies konfigurierbar. Nicht alle Plattformen bieten alle die oben genannten, AFAIK, aber sicherlich mehr als eine Strategie. Standard für viele Plattformen ist wahrscheinlich 7, halb gleich oder 5, halb hoch. –

+1

Ich schätze den IEEE-Standard (den die meisten Plattformen verwenden) spezifiziert, dies, obwohl ich nicht geschaut habe: https://en.wikipedia.org/wiki/IEEE_floating_point#Expression_evaluation –

+2

Der IEEE-Standard spezifiziert zwar solche Dinge ABER Die Java-VM-Spezifikation spezifiziert eine subtil unterschiedliche Fließkomma-Arithmetik. Sie könnten beginnen zu lesen unter https://docs.oracle.com/javase/specs/jvms/se8/html/index.html –

Antwort

3

Java Virtual Machine Floating-Point Arithmetic and IEEE 754

...

  • Die Rundungsoperationen der Java Virtual Machine immer IEEE 754 Runde zum nächsten Modus. Ungenaue Ergebnisse werden auf den nächsten darstellbaren Wert gerundet, wobei Bindungen zum Wert mit einem 0-niedrigstwertigen Bit gehen. Dies ist der IEEE 754-Standardmodus. Aber Java Virtual Machine-Anweisungen, die Werte von Fließkommatypen in Werte von ganzzahligen Typen umwandeln, werden gegen Null gerundet. Die Java Virtual Machine bietet keine Möglichkeit, den Gleitkommarundungsmodus zu ändern.

So wie Patricia Shanahan bereits in den Kommentaren beantwortet, JVM Rundungsmodus wird zur nächsten (die Hälfte sogar) bis # 7 Runden festen aus der Liste. Dies gilt jedoch nur für die Float-to-Float-Rundung. Float-zu-Integer-Rundung verwendet # 2 Rundung in Richtung Null