[Novize] Warum Double anstatt Float ??



  • Hallo Leute!

    Schlage mich gerade durch das Lehrbuch : "Beginning_C-_From_Novice_to_Professional,_4th_Edition"

    Ich bin nun bei Kapitel 3 angelangt. "Making Decisions"
    Jedoch hapert es nun bei einer kleinen Sache welche mich verwirrt.

    /* Program 3.2 Using if statements to decide on a discount */
    #include <stdio.h>
    int main(void)
    {
    const double unit_price = 3.50; /* Unit price in dollars */
    int quantity = 0;
    printf("Enter the number that you want to buy:"); /* Prompt message */
    scanf(" %d", &quantity); /* Read the input */
    /* Test for order quantity qualifying for a discount */
    if(quantity>10) /* 5% discount */
    printf("The price for %d is $%.2f\n", quantity, quantity*unit_price*0.95);
    else /* No discount */
    printf("The price for %d is $%.2f\n", quantity, quantity*unit_price);
    return 0;
    }
    

    Folgender Code beinhaltet

    const double unit_price
    

    . Im Kapitel davor habe ich einiges über integer und decimal types gelernt. Somit auch das "Double" > "Float" ist was die Reichweite und den Speicherbedarf angeht.

    Nun frage ich mich aber wieso in diesem Beispiel Programm "unit_price" als Double definiert wird. Ich sehe keinen Grund wenn ich die berechnung

    quantity*unit_price*0.95
    

    sehe. Und außerdem wird bei printf das ganze mit dem format specifier %.2f abgerufen. Warum definiert der Author das Ganze als "Double". Wenn es doch keinen Grund dafür gibt? Also keinen rationalen Grund. Der Kunde könnte doch niemals eine Dezimalzahl als Quantität nennen die dann die Komma-Stellen ins unendliche ziehen würden?

    Ich habe bis jetzt alles kapiert - außer die Entscheidung für dieses decimal type.

    Bitte um Aufklärung.

    gruß Charlie



  • Mit double Rechnet man genauer. Die Angabe der Dezimalstellen gilt von der ersten Ziffer an. Bei float mit (i.A) 6 signifikanten Dezimalstellen kannstt du schon ab 1000.00 in Schwierigkeiten kommen.

    float bringt nur einen Vorteil, wenn du wirklich sehr große Arrays/Speicherbereiche davon hast.

    Allerding ist für Geldbeträge auch double nicht der richtige Typ, da es auch da zu Rundungsfehlern kommen kann.
    Da ist es besser man rechnet in Cent und teilt bei der Ausgabe durch 100.



  • Falke88 schrieb:

    ... Der Kunde könnte doch niemals eine Dezimalzahl als Quantität nennen die dann die Komma-Stellen ins unendliche ziehen würden?...

    Für das Dezimalsystem mag das stimmen. Aber im Binärsystem nicht. Da tauchen periodische Nachkommastellen für ganz andere Zahlen auf. Informier dich mal wie floating point Zahlen funktionieren und verusche dann mal die Zahl 0.1 exact im Binärsystem darzustellen. Du wirst dich wundern.



  • Werd ich machen - ich hänge irgendwie immernoch an diesem Thema fest.

    Ebenfalls etwas was ich immernoch NICHT gerallt habe:

    const long unit_price = 350L; /* Unit price in cents */
    int quantity = 0;
    printf("Enter the number that you want to buy:"); /* Prompt message */
    scanf(" %d", &quantity); /* Read the input */
    long discount = 0L; /* Discount allowed */
    if(quantity>10)
    discount = 5L; /* 5% discount */
    long total_price = quantity*unit_price*(100-discount)/100;
    long dollars = total_price/100;
    long cents = total_price%100;
    printf("\nThe price for %d is $%ld.%ld\n", quantity, dollars,cents);
    

    Warum denn bitte

    Long discount = 0L
    

    Ich kann die Wahl von Long verstehen - aber nicht warum man die Variable mit "long" definiert und den Wert dann nochmal mit "L" initialisiert ???

    Der Wert in dieser Variablen hat doch schon den Speicherplatz für den Typ Long ? Wieso nochmal ein "L" dann?

    Wenn ich eine große Ganzzahl wie 1235235346432423423 in einer Berechnung hätte z.B:

    Ergebnis = Zahl + 1235235346432423423L
    

    dann verstehe ich dass - damit die konstante Ganzzahl halt den richtigen Speicherplatz Typ zugewiesen bekommt. (oder?)

    gruß Charlie



  • Kann das jemand erläutern?



  • Anscheinend nicht.

    Frag den Autor.


  • Mod

    Falke88[tmp] schrieb:

    Kann das jemand erläutern?

    Das Benutzen des L macht hier nicht wirklich Sinn. Ich spekuliere mal, dass der Autor nicht wirklich weiß, was er in C warum macht. Leider gibt es im Bereich der Programmierung leider sehr viele schlechte Lehrbücher. Diese bekommen auf Amazon auch noch gute Noten, weil Anfänger nicht erkennen können, wenn sie Mist lernen.

    Gucken wir mal die anderen Veröffentlichungen des Autors an:
    1995: Turbo C++
    1995: C
    1996: Visual C++ 4
    1997: Visual C++ 5
    1997: MFC
    1997: C
    1997: Java
    usw.

    Entweder ist er der Übergott der Programmierung oder er setzt sich nicht wirklich tiefgehend mit den Themen auseinander, über die er schreibt. Du darfst selber entscheiden, was wahrscheinlicher ist 😉 .



  • Falke88[tmp] schrieb:

    Warum denn bitte

    Long discount = 0L
    

    Bei alleinstehenden Integer-Literalen sind explizite Typ-Spezifizierer nur nötig, wenn man die implizite Typanpassung umgehen will, sonst haben sie eigentlich nur dekorativen d.h. dokumentierenden Charakter.

    unsigned long x = -1UL;
    

    Falke88[tmp] schrieb:

    Ergebnis = Zahl + 1235235346432423423L
    

    Bei mehrteiligen arithmetischen Ausdrücken dienen Typ-Spezifizierer meist der Fokussierung auf den (Gesamt)Ergebniszieltyp, d.h. zur Vermeidung von Über/Unterläufen:

    int Zahl = 1;
    long long Ergebnis = 2147483647 + Zahl;  /* geht schief */
    long long Ergebnis = 2147483647LL + Zahl;  /* geht nicht schief */
    

Anmelden zum Antworten