5.3 Mathe bitte strikt
 
Bei der Berechnung mit Fließkommazahlen schreibt die Definition des IEEE 754-Standard vor, wie numerische Berechnungen durchgeführt werden. Damit soll die CPU für float und double mit 32 beziehungsweise 64 Bit rechnen. In der Wirklichkeit rechnet jedoch so gut wie kein mathematischer Prozessor mit diesen Größen, außer vielleicht AMD mit ihrer 3Dnow!-Technologie. Auf der PC-Seite kommen Intel und AMD mit internen Rechengenauigkeiten von 80 Bit, also 10 Bytes, zum Zuge. Dieses Dilemma betrifft aber nur 80 x 86 und andere CISC-Prozessoren. Bei RISC sind 32 Bit und 64 Bit das Übliche. Die 80-Bit-Lösung bringt in Java zwei Nachteile mit sich:
|
Diese Genauigkeit kann bisher von Java nicht genutzt werden. |
|
Wegen der starren IEEE 754-Spezifikation kann der Prozessor weniger Optimierungen durchführen, weil er sich immer eng an die Norm halten muss. Das kostet Zeit. Gegebenenfalls könnten aber die mathematischen Ergebnisse auf unterschiedlichen Maschinen anders aussehen. |
5.3.1 Strikt Fließkomma mit strictfp
 
Damit zum einen die Vorgaben der Norm erfüllt werden und zum anderen die Geschwindigkeit gewährleistet werden kann, lässt sich vor Klassen- und Methoden der Modifizierer strictfp setzen, damit Operationen strikt nach der IEEE-Norm vorgehen. Ohne dieses Schlüsselwort (wie es also für unsere meisten Programme der Fall ist) wird eine interne Optimierung vorgenommen. Nach außen bleiben die Datentypen 32 Bit und 64 Bit lang, das heißt, bei den Konstanten in double und float ändert sich nichts. Zwischenergebnisse bei Fließkommaberechnungen werden aber eventuell mit höherer Genauigkeit berechnet.
5.3.2 Die Klassen Math und StrictMath
 
Die Umsetzung der Striktheit in der Math-Klasse wird durch zwei Klassen erreicht: Math und StrictMath. An der Klassendeklaration für StrictMath lässt sich ablesen, dass alle Methoden sich an die IEEE-Norm halten.
public final strictfp class StrictMath {
// ...
}
Die Implementierung ist bisher für Math und StrictMath die gleiche. Alle Methoden mit Berechnungen werden an StrictMath weitergeleitet.
public final strictfp class Math
{
public static double tan(double a) {
return StrictMath.tan(a);
// default impl. delegates to StrictMath
}
// ...
}
|