Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort

Download:
- ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren mit der Java Standard Edition Version 6
Buch: Java ist auch eine Insel

Java ist auch eine Insel
7., aktualisierte Auflage
geb., mit DVD (November 2007)
1.492 S., 49,90 Euro
Galileo Computing
ISBN 978-3-8362-1146-8
Pfeil 5 Mathematisches
Pfeil 5.1 Repräsentation ganzer Zahlen – das Zweierkomplement
Pfeil 5.2 Fließkommaarithmetik in Java
Pfeil 5.2.1 Mantisse und Exponent
Pfeil 5.2.2 Spezialwerte Unendlich, Null, NaN
Pfeil 5.3 Wertebereich eines Typs und Überlaufkontrolle
Pfeil 5.3.1 Behandlung des Überlaufs
Pfeil 5.4 Die Eigenschaften der Klasse Math
Pfeil 5.4.1 Attribute
Pfeil 5.4.2 Absolutwerte und Maximum/Minimum
Pfeil 5.4.3 Winkelfunktionen
Pfeil 5.4.4 Runden von Werten
Pfeil 5.4.5 Wurzel und Exponentialfunktionen
Pfeil 5.4.6 Der Logarithmus
Pfeil 5.4.7 Rest der ganzzahligen Division
Pfeil 5.4.8 Zufallszahlen
Pfeil 5.5 Mathe bitte strikt
Pfeil 5.5.1 Strikt Fließkomma mit strictfp
Pfeil 5.5.2 Die Klassen Math und StrictMath
Pfeil 5.6 Die Random-Klasse
Pfeil 5.6.1 Objekte aufbauen und der Seed
Pfeil 5.6.2 Zufallszahlen erzeugen
Pfeil 5.6.3 Pseudo-Zufallszahlen in der Normalverteilung
Pfeil 5.7 Große Zahlen
Pfeil 5.7.1 Die Klasse BigInteger
Pfeil 5.7.2 Funktionen von BigInteger
Pfeil 5.7.3 Ganz lange Fakultäten
Pfeil 5.7.4 Große Fließkommazahlen mit BigDecimal
Pfeil 5.7.5 Mit MathContext komfortabel die Rechengenauigkeit setzen
Pfeil 5.8 Zum Weiterlesen


Galileo Computing - Zum Seitenanfang

5.3 Wertebereich eines Typs und Überlaufkontrolle Zur nächsten ÜberschriftZur vorigen Überschrift

Die Klassen Byte, Short, Integer, Long, Float und Double besitzen die Konstanten MIN_VALUE und MAX_VALUE für den minimalen und maximalen Wertebereich. Die Klassen Float und Double verfügen zusätzlich über die wichtigen Konstanten NEGATIVE_INFINITY und POSITIVE_INFINITY für minus und plus unendlich und NaN (Not a Number, undefiniert).


Hinweis Hinweis Es ist schon etwas seltsam, dass es in java.lang.Integer und in java.lang.Double die Konstante MIN_VALUE gibt, diese aber jeweils etwas anderes bedeutet. Bei Integer steht sie für den kleinsten Wert, den die Ganzzahl annehmen kann, bei Double.MIN_VALUE jedoch für die kleinste positive Zahl, die ein Double darstellen kann.


Alle Wrapper-Klassen überschreiben toString() von Object so, dass sie eine String-Repräsentation des Objekts zurückgeben.


Galileo Computing - Zum Seitenanfang

5.3.1 Behandlung des Überlaufs topZur vorigen Überschrift

Bei einigen mathematischen Fragestellungen müssen Sie feststellen können, ob Operationen wie die Addition, Subtraktion oder Multiplikation den Zahlenbereich sprengen, also etwa den Ganzzahlenbereich eines Integers von 32 Bit verlassen. Passt das Ergebnis einer Berechnung nicht in den Wertebereich einer Zahl, so wird dieser Fehler nicht von Java angezeigt; weder der Compiler noch die Laufzeitumgebung melden dieses Problem. Es gibt auch keine Ausnahme.

Mathematisch gilt a * a / a = a, also z. B. 100 000 * 100 000 / 100 000 = 100 000. In Java ist das anders, da wir bei 100 000 * 100 000 einen Überlauf im int haben.

System.out.println( 100000 * 100000 / 100000 );     // 14100

liefert daher 14100. Wenn wir den Datentyp auf long erhöhen, indem wir hinter ein 100 000 ein L setzen, sind wir bei dieser Multiplikation noch sicher, da ein long das Ergebnis aufnehmen kann.

System.out.println( 100000L * 100000 / 100000 );    // 100000

Überlauf erkennen

Für die Operationen Addition und Subtraktion lässt sich das noch ohne allzu großen Aufwand implementieren. Wir vergleichen dazu zunächst das Ergebnis mit den Konstanten Integer.MAX_VALUE und Integer.MIN_VALUE. Natürlich muss der Vergleich so umgeformt werden, dass dabei kein Überlauf auftritt, also a + b > Integer.MAX_VALUE ist. Überschreiten die Werte diese maximalen Werte, ist die Operation nicht ohne Fehler möglich, und wir setzen das Flag canAdd auf false. Hier die Programmzeilen für die Addition:

if ( a >=0 && b >= 0 ) 
  if ( ! (b <= Integer.MAX_VALUE – a) ) 
    canAdd = false; 
if ( a < 0 && b < 0 ) 
  if ( ! (b >= Integer.MIN_VALUE – a) ) 
    canAdd = false;

Bei der Multiplikation gibt es zwei Möglichkeiten. Zunächst einmal lässt sich die Multiplikation als Folge von Additionen darstellen. Dann ließe sich wiederum der Test mit der Konstante Integer.XXX_VALUE durchführen. Diese Lösung scheidet jedoch wegen der Geschwindigkeit aus. Der andere Weg sieht eine Umwandlung nach long vor. Das Ergebnis wird zunächst als long berechnet und anschließend mit dem Ganzzahlwert vom Typ int verglichen.

Dies funktioniert jedoch nur mit Datentypen, die kleiner als long sind. long selbst fällt heraus, da es keinen Datentyp gibt, der größer ist. Mit ein wenig Rechenungenauigkeit würde ein double jedoch weiterhelfen, und bei präziserer Berechnung kann BigInteger helfen. Bei der Multiplikation im Wertebereich int lässt sich ähnlich wie bei der Addition auch b > Integer.MAX_VALUE / a schreiben. Bei b == Integer.MAX_VALUE / a muss ein Test genau zeigen, ob das Ergebnis in den Wertebereich passt.

Die folgende Methode canMulLong() soll bei der Frage nach dem Überlauf helfen:

Listing 5.2 Overflow.java

import java.math.BigInteger; 
 
public class Overflow 
{ 
  private final static BigInteger MAX = BigInteger.valueOf( Long.MAX_VALUE ); 
 
  public static boolean canMulLong( long a, long b ) 
  { 
    BigInteger bigA = BigInteger.valueOf( a ); 
    BigInteger bigB = BigInteger.valueOf( b ); 
 
    return bigB.multiply( bigA ).compareTo( MAX ) <= 0; 
  } 
 
  public static void main( String[] args ) 
  { 
    System.out.println( canMulLong(Long.MAX_VALUE/2, 2) );          // true 
    System.out.println( Long.MAX_VALUE/2 * 2 );      // 9223372036854775806 
    System.out.println( canMulLong(Long.MAX_VALUE/2 + 1, 2) );      // false 
    System.out.println( (Long.MAX_VALUE/2 + 1) * 2 ); //-9223372036854775808 
  } 
}


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.






<< zurück



Copyright © Galileo Press 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de