float zu double und anders herum - Standard?



  • Hi.
    Ich wollte mal wissen ob im Standard folgendes Verhalten wohldefiniert ist:

    float myFloat = static_cast<float>(myDouble);
    // und anders herum
    

    Und für die Zukunft: Wie finde ich so etwas mal selber raus? Wie soll ich in de(m|n) Dokument(en) gerade die Stelle finden, die das definiert?

    Gruß


  • Mod

    Nein:

    C++ Standard schrieb:

    Floating point conversions

    An rvalue of floating point type can be converted to an rvalue of another floating point type. If the source value can be exactly represented in the destination type, the result of the conversion is that exact representation. If the source value is between two adjacent destination values, the result of the conversion is an implementation-defined choice of either of those values. Otherwise, the behavior is undefined.

    The conversions allowed as floating point promotions are excluded from the set of floating point conversions.

    [...]

    Floating point promotion

    An rvalue of type float can be converted to an rvalue of type double. The value is unchanged.
    This conversion is called floating point promotion.

    theliquidwave schrieb:

    Und für die Zukunft: Wie finde ich so etwas mal selber raus? Wie soll ich in de(m|n) Dokument(en) gerade die Stelle finden, die das definiert?

    Im Inhaltsverzeichnis? Ich denke die Überschrift "Standard conversions: Floating point conversions" ist doch recht aussagekräftig.

    Ansonsten: Überfliege einmal den Standard. Dann weißt du, was ungefähr wo steht. Versuche Fragen zum Standard die hier im Forum gestellt werden selbstständig zu beantworten. Und sei es durch Volltextsuche, wenn du im Inhaltsverzeichnis nichts findest. Dann findest du dich nach kurzer Zeit zumindest grob im Standard zurecht.

    (Wobei ich zugeben muss, dass einige Sachen im Standard nur sehr obskur und indirekt definiert werden. Paradebeispiel für etwas schwer zu findendes ist meiner Meinung nach die Mindestgröße der integralen Typen.)



  • Das "Otherwise, the behavior is undefined" bezieht sich nur auf den Fall, in dem sich der double -Wert ausserhalb des float -Wertebereichs befindet und deshalb nicht zwischen zwei benachbarten möglichen float -Repräsentationen liegt. Sonst (und mit dem Fall hat man wohl am meisten zu tun) wird die Konversion klappen.



  • Dann habe ich ja Glück gehabt. Es geht bei mir nur um Werte zwischen -1.0 und max. 10000.0 - das sollte ja problemlos hinhauen 😉

    Gruß und Danke


  • Mod

    Ach so, es geht nur darum, ob es überhaupt funktioniert. Ich hatte gedacht es ginge darum, ob das exakte Ergebnis definiert wäre (Was es nicht unbedingt ist. Siehe oben).



  • Jupp. Genauigkeit spielt eigentlich gar keine Rolle. Hauptsache aus -1.0 wird nicht 200.0

    Gruß


Anmelden zum Antworten