Vorsicht bei Gleitkommazahlen!

[Progra] Programmierung
[DSAL] Datenstrukturen und Algorithmen
[SWT] Softwaretechnik
[DB] Datenbanken und Informationssysteme

Vorsicht bei Gleitkommazahlen!

Beitragvon herzchen1107 » 12.11.13 21:21

Hallo Allerseits!

Ich bin Erstsemester im Informatik-Studium und verfüge über kaum Wissen bzw. Vorkenntnisse. Bei der Aufgabe weiß ich gar nicht was ich machen soll, also bitte ich euch sehr um Hilfe! Wäre echt sehr dankbar, wenn mir jemand weiter helfen und mir Denkansätze/ Tipps geben könnte. :?

P.S.: Ich wäre auch froh, über Bücher- bzw. Lerntipps, wie ich besser in die Programmierung einsteigen kann mit Null Vorkenntnis.

Vorsicht bei Gleitkommazahlen
Öffnet das Projekt Gleitkommazahlen. Es enthält eine (absichtlich nicht übersetzte) Klasse Nanu mit mehreren Methoden, die Ihr euch sehr genau ansehen sollt. Versucht, den Quelltext zu verstehen und in eurem Kopf „auszuführen“, bevor ihr die Klasse übersetzt. Nehmt euch maximal 45 Minuten Zeit für diese Aufgabe.
4.3.1 Welche Ergebnisse erwartet ihr beim Aufruf der Methoden? Schreibt diese in den vorbereiteten Schnittstellenkommentar der Methoden.
4.3.2 Erzeugt ein Exemplar der Klasse Nanu und führt die Methoden aus. Seid ihr von den Ergebnissen über-rascht? Kommentiert nun (analog zum erwarteten Verhalten) das tatsächliche Verhalten aller Methoden.
4.3.3 Bereitet euch darauf vor mit euren Betreuern zu diskutieren, warum das tatsächliche Verhalten vom erwarte-ten Verhalten abweicht. Der Debugger von BlueJ dürfte dabei eine große Hilfe sein. Schreibt eure Begrün-dung wieder in den Schnittstellenkommentar. Falls ihr nicht versteht, wie das tatsächliche Ergebnis zustande kommt, dann fragt eure Betreuer. Ihr solltet dann aber zukünftig erst recht einen Bogen um die Verwendung von float und double machen.

Hier ist der Quelltext von der Klasse Nanu

Code: Alles auswählen
 :!: /**
 * Nicht alle in dieser Klasse enthaltenen Methoden tun das,
 * was sie auf den ersten Blick versprechen.
 *
 * @author Fredrik Winkler
 * @version 11/2010
 */
class Nanu
{
    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public double a_einAchtel()
    {
        return 0.125f;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public double b_einZehntel()
    {
        return 0.1f;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public float c_gibSchwerkraft()
    {
        return 981 / 100;
    }
 
    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public float d_hinUndWeg()
    {
        float a = 0;
        float b = 0.1f;
        a = a + b; //  1
        a = a + b; //  2
        a = a + b; //  3
        a = a + b; //  4
        a = a + b; //  5
        a = a + b; //  6
        a = a + b; //  7
        a = a + b; //  8
        a = a + b; //  9
        a = a + b; // 10
        a = a - 1;
        return a;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public boolean e_vieleDezimalstellen()
    {
        float  f = 0.1640625f;
        double d = 0.1640625;
        return f == d;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public boolean f_eineDezimalstelle()
    {
        float  f = 0.1f;
        double d = 0.1;
        return f == d;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public float g_einBisschenMehr()
    {
        float a = 123456789;
        float b = a + 1 - a;
        return b;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public float h_sehrVielMehr()
    {
        float a = 123456789;
        float b = a + 1 + 1 + 1 + 1 + 1 - a;
        return b;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public float i_andersGeklammert()
    {
        float a = 123456789;
        float b = a + (1 + 1 + 1 + 1 + 1) - a;
        return b;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public boolean j_istAgleichA()
    {
        float a = 0.123f;
        a = a / a;
        return a == a;
    }

    /**
    * Erwarteter Rueckgabewert:
    *
    *
    * Tatsaechlicher Rueckgabewert:
    *
    *
    * Erklaerung:
    *
    */
    public boolean k_NaNu()
    {
        float a = 1 / 2;
        a = a / a;
        return a == a;
    }
}
herzchen1107
 
Beiträge: 1
Registriert: 12.11.13 21:12
Studiert seit: ?
Anwendungsfach: Sonstiges

Re: Vorsicht bei Gleitkommazahlen!

Beitragvon Briedensen » 12.11.13 21:48

Hallo und herzlich Willkommen! :)

Der Sinn und Zweck dieser Aufgabe ist es, dir zu zeigen, dass die (primitiven) Datenstrukturen "int", "double" und "float" so ihre Unterschiede und eventuelle Tücken haben!
Es wäre ganz schön, wenn du dein Problem ein wenig besser beschreibst, da man sich nicht wirklich denken kann, wo genau deine Probleme liegen.

(Mal blind geraten):

int: Steht für Integer und enthält Ganzzahlen. Kann Zahlen von −32.768 bis 32.767 darstellen.
float: Steht für eine Gleitkommazahl. (Die Darstellung hast du vielleicht schon in Technische Informatik gesehen)...
double: Steht für eine Gleitkommazahl mit doppelter Genauigkeit (wird mehr Speicherplatz im PC zugewiesen als float).

Float und Double bekommen (meines Wissens nach; keine Garantie!) eine gewisse Menge an Speicher zugewiesen; wie schon erwähnt double mehr als float.
Die Darstellung dieser Gleitkommazahlen erfolgt durch:
1. Ein Vorzeichen (das erste Bit)
2. Der Mantisse (oder auch Basis)
3. Dem Exponenten.

Bei genaueren Fragen gibts genauere Antworten, und eventuell schaust du mal bei Wikipedia vorbei...

LG,
Briedensen
Briedensen
 
Beiträge: 5
Registriert: 09.11.13 13:50
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 12/13

Re: Vorsicht bei Gleitkommazahlen!

Beitragvon HE » 12.11.13 21:57

Briedensen hat geschrieben:int: Steht für Integer und enthält Ganzzahlen. Kann Zahlen von −32.768 bis 32.767 darstellen.


Das ist ja etwas knapp. int hat in Java 32bit und daher einen wesentlich größeren Wertebereich.

Liebe Grüße,
Marc
Benutzeravatar
HE
 
Beiträge: 453
Registriert: 09.03.07 12:20
Wohnort: Aachen
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Re: Vorsicht bei Gleitkommazahlen!

Beitragvon Briedensen » 12.11.13 22:04

HE hat geschrieben:
Briedensen hat geschrieben:int: Steht für Integer und enthält Ganzzahlen. Kann Zahlen von −32.768 bis 32.767 darstellen.


Das ist ja etwas knapp. int hat in Java 32bit und daher einen wesentlich größeren Wertebereich.

Liebe Grüße,
Marc


Ja, das kann gut sein. Ich bin auch recht neu in Java, und mein Beitrag sollte eigentlich nur erstmal Erste-Hilfe leisten :)!
Trotzdem cool, dass du mich drauf aufmerksam gemacht hast, dann will ich meinen Fehler mal Fix beheben, und sage:

int: Steht für Integer und enthält Ganzzahlen. Kann Zahlen von −2.147.483.648 bis 2.147.483.647 darstellen.

Quelle: http://de.wikipedia.org/wiki/Integer_(Datentyp)#Maximaler_Wertebereich_von_Integer

Liebe Grüße,
Briedensen
Briedensen
 
Beiträge: 5
Registriert: 09.11.13 13:50
Studiengang: Informatik (B.Sc.)
Studiert seit: WS 12/13


Zurück zu Praktische Informatik