Implizite Typkonvertierung



  • Hallo ihr 🙂

    Nur eine ganz kleine Frage:

    double foo;
    foo = 42;  // Variante 1
    foo = 42.; // Variante 2
    

    Sind beide Varianten zur Laufzeit äquivalent? Sprich: Konvertiert der Compiler bereits zur Compilezeit Variante 1 in eine double-Konstante oder wird zuerst eine temporäre int-Konstante erzeugt, die dann in einen double-Wert gecastet wird?

    Welche der beiden Varianten sollte man benutzen?

    Vielen Dank schon einmal für die vermutlich wie immer kompetente Hilfe 🙂

    PS: Gleiches gilt natürlich auch, wenn man eine double-Variable mit einer ganzzahligen Zahl vergleichen will:

    double foo = ....;
    if (foo >= 42) bar();  // Variante 1
    if (foo >= 42.) bar(); // Variante 2
    


  • Bloops schrieb:

    Sind beide Varianten zur Laufzeit äquivalent?

    An Stellen wo es wirklich keinen echten Mehraufwand bedeuted, würde ich mich nicht einfach auf Compileroptimierungen verlassen. Daher würde ich einen double auch einen Doublewert zuweisen.

    Bloops schrieb:

    PS: Gleiches gilt natürlich auch, wenn man eine double-Variable mit einer ganzzahligen Zahl vergleichen will:

    Hier gilt das gleiche, zusätzlich aber:
    Fließkommazahlen sollte man niemals mit einem exakten Vergleich auf Gleichheit prüfen! Fließkommazahlen sind nicht genau. Statt dessen macht man eigentlich immer einen Deltavergleich, mit einem sinnvoll gewählten Schwellenwert.

    cu André



  • Vielen Dank für die schnelle Antwort erstmal!

    asc schrieb:

    ... würde ich mich nicht einfach auf Compileroptimierungen verlassen ...

    Das heißt, es ist compilerabhängig und nirgendwo spezifiziert/standardisiert?

    asc schrieb:

    Fließkommazahlen sollte man niemals mit einem exakten Vergleich auf Gleichheit prüfen!

    Weiß ich doch 😋 Aber sollte nicht eine ganzzahlige Zahl, die noch komplett in die Mantisse passt, auch exakt repräsentiert werden? 😕 Bei großen Zahlen und Kommazahlen, siehts natürlich anders aus. Wie dem auch sei, ich ändere einfach mal den vorigen Post, um Klarheit zu schaffen 🙂



  • Bloops schrieb:

    Weiß ich doch 😋 Aber sollte nicht eine ganzzahlige Zahl, die noch komplett in die Mantisse passt, auch exakt repräsentiert werden?

    Ich sehe es so: Es kann leicht passieren das man Code nochmals um eine Berechnung etc. erweitert, und sich dann auf einmal Wundert das etwas nicht mehr wie erwartet läuft. Es geht nicht um die Ganzzahl, sondern wie sich die Fließkommazahl herleitet. Sobald Berechnungen ins Spiel kommen, ist die Gleichheit nicht mehr garantiert.

    Davon abgesehen: 1 ist als Integer definiert, 1.0 als double. Die Frage ist nur was der Compiler macht, wenn er eine Fixe Initialisierung sieht. In so fern: Compilerabhängig.


Anmelden zum Antworten