Suffix(e)



  • 314159265358979 schrieb:

    Du kannst beides verwenden, in dem Fall ist es egal. Wichtiger ist es bei Überladungen.

    Mmmmhhh... also ist es ersteinmal für mich "unwichtig"? Da ich noch nicht beim Thema Überladungen angekommen bin.?

    Vielen Dank schon mal für euere Hilfe



  • Guten Morgen,
    wo siehst du bei deinen deinen beiden Zitaten nun Gegensätze?

    Suffix = etwas, das du an das Ende von etwas anhängst.
    Prefix = etwas, das du an den Anfang von etwas anhängst.

    Literal = konstanter Ausdruck:

    /*
            Ganzzahlen: 123
            Fließkommazahlen: 1.23
            Zeichen: 'a'
            Zeichenkette: "abc"
            Wahrheitswerte: true, false
            const
            Konstanten eines enum
            ...
        */
    
    /*
            Gibst du einfach so eine Ganzzahl an, ist sie vom Datentyp int.
        */
        cout << 123;
    
        /*
            Willst du z.B. nun aber eine Ganzzahl vom Datentyp long int.
        */
        cout << 123l << "oder" << 123L; // l/L = Suffix
    

    Der Datentyp bestimmt den Wertebereich. short int hat z.B. 2Byte, kann demnach nur 2^16 verschiedene Werte fassen. int hat z.B. 4Byte, kann demnach nur 2^32 verschiedene Werte fassen.

    lg



  • Guten Morgen Gugelmoser,

    Ich versteh es leider noch nicht so ganz.
    ich habe jetzt folgendes ausprobiert:

    cout << "Fließkommazahl: " << 12.12345678910 << endl;
    cout << "Fließkommazahl: " << 12.12345678910f << endl;
    

    Beide Ausgaben enden bei der 4-Nachkommastelle mit 5 (also gerundet).

    Wieso? Float hat doch 7-Stellen oder nicht?

    lg Schany


  • Mod

    Gugelmoser schrieb:

    Guten Morgen,
    wo siehst du bei deinen deinen beiden Zitaten nun Gegensätze?

    Das Galileo-Buch behauptet, Groß-/Kleinschribung spiele keine Rolle. Das ist bedingt richtig, solange man Zeichenkettenliterale weglässt (da wären es auch strenggenommen Präfixe, aber mit dem gleichen Effekt).

    JW behauptet, es würde den Wertebereich ändern. Das ist einfach nur ungenau. Es ändert sich der Typ und das ist das richtige und das wichtige.


  • Mod

    Schany schrieb:

    Wieso? Float hat doch 7-Stellen oder nicht?

    Ja, aber cout zeigt davon standardmäßig erst einmal nur 4 an, sofern du nicht erst die Darstellungsform von Fließkommazahlen änderst.



  • Was meinst Du damit?
    Sry. aber wie gesagt ich bin noch blutiger Anfänger, ich möchte jedoch verstehen was ich da mache und aus meinen Buch werde ich leider nicht schlau.

    Wann und wozu verwende ich den Suffixe?

    Bei dem Beispiel aus meinem Buch verstehe ich z.B. wie schon gesagt nicht wieso ich die Variable als Float deklariere und anschließen die Zahl den Suffix f gebe.
    Bsp. aus dem Buch:

    const Float MWST=1.19f;
    

    ist das dann nicht doppelt gemoppelt?

    Gruß
    Schany



  • Schany schrieb:

    const Float MWST=1.19f;
    

    ist das dann nicht doppelt gemoppelt?

    1.19 ist ein Literal.
    MWST ist eine Variable.

    Ein Literal hat einen Typ.
    Eine Variable hat einen Typ.
    Sind diese beiden Typen nicht kompatibel, gibt es einen Fehler.

    Lässt du das f weg, so gibt es noch einen automatischen Cast, da 1.19 vom Typ double, die Variable aber vom Typ float ist.

    lg



  • Suffix 'd' für double? Gibt's doch gar nicht.



  • void funktion(float f)
    {
        cout << "float";
    }
    
    void funktion(double d)
    {
        cout << "double";
    }
    
    int main()
    {
        funktion(1.23); // Du willst nun die Funktion für float aufrufen...
                        // Das Literal 1.23 ist aber vom Typ double...
                        // Für die Funktion mit float brauchst du aber ein Literal vom Typ float...
        funktion(1.23f);
    
        cin.get();
        return 0;
    }
    


  • Schany schrieb:

    Bsp. aus dem Buch:

    const Float MWST=1.19f;
    

    ist das dann nicht doppelt gemoppelt?

    Nein ist es nicht. Du hast hier mehrere Dinge: Zum Einen eine Deklaration/Definition einer Variablen mit Namen MWST und Typ Float (der übrigens kein C++-Typ ist, meintest du float?)
    Zum Anderen initialisierst du diese Variable mit einem Wert. Diesen definierst du durch das Literal 1.19f, auch vom Typ float (durch das Suffix)
    Folgendes wäre auch möglich:

    const float MWST=1.19; //1
    const double MWST=1.19f; //2
    const double MWST=1.19d; //3
    

    bei 1 initialisierst du die float-Variable mit einem double-Wert. Das geht nur, weil es eine implizite Konvertierung von double nach float gibt. Evtl wird hier der Compiler aber eine Warnung geben, weil double genauer als float ist und im Allgemeinen bei der Konvertierung Stellen verloren gehen können.
    bei 2 initialisierst du einen double mit einem float-Literal. Das geht, weil der Compiler eine implizite Konvertierung von float nach double erlaubt.
    bei 3 initialisierst du einen double mit einem double-Literal, hier gibts keine Konvertierung.

    Was gerade bei float und double noch angemerkt werden muss ist, dass 1.19f und 1.19 in Wirklichkeit unterschiedliche Werte haben können. Der Grund ist, dass die Variablen intern im 2er System gespeichert werden und nur eine begrenzte Anzahl von Stellen zur Verfügung steht. Vergleichbar ist das mit der Darstellung von 1/3: Während im 3er-System die Zahl mit nur einer Nachkommastelle darstellbar ist (0,1)3, ist sie im Dezimalsystem eine periodische Zahl und mit begrenzter Genauigkleit nicht exakt darstellbar.

    Beispiel:

    #include <iostream>
    #include <iomanip>
    using std::cout;
    
    int main()
    {
      float f= 1.19f;
      double d = 1.19;
      cout << setprecision(20) << f << '\n' << setprecision(20) << d << '\n';
    }
    

    Output:

    1.1900000572204589844
    1.1899999999999999467
    


  • krümelkacker schrieb:

    Suffix 'd' für double? Gibt's doch gar nicht.

    http://ideone.com/LOnUH 😉



  • Gugelmoser schrieb:

    Der Datentyp bestimmt den Wertebereich. short int hat z.B. 2Byte, kann demnach nur 2^16 verschiedene Werte fassen.

    Oha! So darfst Du das natürlich nicht formulieren. der C++ ISO Standard legt weder sizeof(short)==2 noch CHAR_BIT==8 fest. Das, was er festlegt, ist

    CHAR_BIT  >=      8
    SCHAR_MIN <=   -127
    SCHAR_MAX >=    127
    UCHAR_MAX >=    255,  mit UCHAR_MAX == pow(2,CHAR_BIT)-1
    SHRT_MIN  <= -32767
    SHRT_MAX  >=  32767
    USHRT_MAX >=  65535
    INT_MIN   <= -32767
    INT_MAX   >=  32767
    UINT_MAX  >=  65535
    LONG_MIN  <= -(2^31-1)
    LONG_MAX  >=   2^31-1
    ULONG_MAX >=   2^32-1
    

    und dass entweder

    CHAR_MIN == 0
    CHAR_MAX == UCHAR_MAX
    

    oder

    CHAR_MIN == SCHAR_MIN
    CHAR_MAX == SCHAR_MAX
    

    gilt.

    siehe
    http://jk-technology.com/c/inttypes.html



  • 314159265358979 schrieb:

    krümelkacker schrieb:

    Suffix 'd' für double? Gibt's doch gar nicht.

    http://ideone.com/LOnUH 😉

    Okay, das zeigt, dass es einen Compiler gibt (gcc 4.5.1), der suffix 'd' für double akzeptiert. Womit das etwas ungenaue "gibt's doch garnicht" widerlegt wäre.
    Was krümelkacker aber vermutlich meinte ist, dass der C++98/C++03-Standard das Suffix nicht definiert. Der C++0x-Draft vom 28.2. Übrigens auch nicht.

    2.13.3 Floating literals
    *floating-literal:

    fractional-constant exponent-partoptfloating-suffixopt

    digit-sequence exponent-part floating-suffixopt
    *

    [...]
    floating-suffix: one of
    f l F L

    Der ältere gcc 4.3.4 schluckt das übrigens nicht: http://ideone.com/MyMJW



  • int zahl = 12312;
    
    std::cout << zahl / 1.0f;
    


  • Mit der Einstellung -Wall (g++) oder /W4 (MSVC) bekommst du bei sowas wie

    float foo = 1.0;
    double bar = 1.0f;
    

    auch eine Warnung zwecks der Konvertierung.



  • pumuckl schrieb:

    314159265358979 schrieb:

    krümelkacker schrieb:

    Suffix 'd' für double? Gibt's doch gar nicht.

    http://ideone.com/LOnUH 😉

    (...)
    Der ältere gcc 4.3.4 schluckt das übrigens nicht: http://ideone.com/MyMJW

    Comeau frisst es auch nicht:

    Comeau C/C++ 4.3.10.1 schrieb:

    "ComeauTest.c", line 3: error: extra text after expected end of number
    double d = 123.0d;


Anmelden zum Antworten