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?
<< zurück | Galileo Computing / <openbook> /Java-Insel | vor >>
Java ist auch eine Insel von Christian Ullenboom Programmieren mit der Java Standard Edition Version 6
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 |
| 5 Mathematisches
|  | 5.1 Repräsentation ganzer Zahlen – das Zweierkomplement
|  | 5.2 Fließkommaarithmetik in Java
|  |  | 5.2.1 Mantisse und Exponent
|  |  | 5.2.2 Spezialwerte Unendlich, Null, NaN
|  | 5.3 Wertebereich eines Typs und Überlaufkontrolle
|  |  | 5.3.1 Behandlung des Überlaufs
|  | 5.4 Die Eigenschaften der Klasse Math
|  |  | 5.4.1 Attribute
|  |  | 5.4.2 Absolutwerte und Maximum/Minimum
|  |  | 5.4.3 Winkelfunktionen
|  |  | 5.4.4 Runden von Werten
|  |  | 5.4.5 Wurzel und Exponentialfunktionen
|  |  | 5.4.6 Der Logarithmus
|  |  | 5.4.7 Rest der ganzzahligen Division
|  |  | 5.4.8 Zufallszahlen
|  | 5.5 Mathe bitte strikt
|  |  | 5.5.1 Strikt Fließkomma mit strictfp
|  |  | 5.5.2 Die Klassen Math und StrictMath
|  | 5.6 Die Random-Klasse
|  |  | 5.6.1 Objekte aufbauen und der Seed
|  |  | 5.6.2 Zufallszahlen erzeugen
|  |  | 5.6.3 Pseudo-Zufallszahlen in der Normalverteilung
|  | 5.7 Große Zahlen
|  |  | 5.7.1 Die Klasse BigInteger
|  |  | 5.7.2 Funktionen von BigInteger
|  |  | 5.7.3 Ganz lange Fakultäten
|  |  | 5.7.4 Große Fließkommazahlen mit BigDecimal
|  |  | 5.7.5 Mit MathContext komfortabel die Rechengenauigkeit setzen
|  | 5.8 Zum Weiterlesen
## 5.3 Wertebereich eines Typs und Überlaufkontrolle 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 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. ### 5.3.1 Behandlung des Überlaufs 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.
Name |
E-Mail |
Ihr Kommentar |
<< zurück | <top> | vor >>

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