c++ unsauber bei rückgabetypen?



  • Hallo liebe c-plusplus.net community!

    Hier ein kurzer Ausschnitt aus meinem C++ Projekt:

    float GeometryHelper::pointLineShortestDistance(...) 
    {
        // ...
        return (vec_AP.x * vec_normal.x + vec_AP.y * vec_normal.y);
    }
    

    Ich bekomme in einem Beispiel einen Wert mit DOUBLE Präzision zurück?!?! Wenn ich beim return explizit auf (float) caste funtioniert das ganze. Aber ich bin wirklich überrascht, dass C++ einfach einen double wert zurückliefert, obwohl ich als rückgabetyp explizit float angegeben habe...

    Ich hätte zumindest eine Warnung vom Compiler erwartet, aber auch wenn ich alle Warnungen sehen möchte kommt dazu nichts... Es ist für mich kein Umstand, vorher zu casten, aber ich bin nur drauf gekommen weil ich bei einem unit test f0.0 erwartet habe und nicht -2.98023e-07 😉

    Oder habe ich irgendwas übersehen und rege mich zu unrecht auf?


  • Mod

    Wie kommst du denn zu deiner Behauptung?



  • Rechenwerkzwerg schrieb:

    Oder habe ich irgendwas übersehen und rege mich zu unrecht auf?

    Ja. Du bekommst einen float zurück.

    Dass du diesen für einen double hältst, liegt wohl an den Ausgabestreams (oder dem Debugger, je nachdem, was du verwendet hast). Mehr angezeigte Stellen bedeutet nicht, dass diese auch genau sind.



  • danke für die schnelle antwort.

    wie kann das sein? ich meine folgendes:
    wenn ich beim return EXPLIZIT auf FLOAT caste, dann kommt was anderes raus als wenn ich nicht caste. obwohl der rückgabetyp float ist! das macht doch gar keinen sinn!



  • die x und y-werte da sind übrigens ebenfalls floats



  • Beantworte zuerst SeppJs Frage. Etwas Code wäre auch nicht schlecht.

    Mit welchem Compiler arbeitest du?



  • Rechenwerkzwerg schrieb:

    danke für die schnelle antwort.

    wie kann das sein? ich meine folgendes:
    wenn ich beim return EXPLIZIT auf FLOAT caste, dann kommt was anderes raus als wenn ich nicht caste. obwohl der rückgabetyp float ist! das macht doch gar keinen sinn!

    Zeig mal den Cast.



  • argh, sorry! 😞
    kurze version:
    SeppJ hatte recht, es ist doch float! Ich bin nur einmal auf 0 gekommen weil ich float zwischergebnisse verwendet hatte...

    lange version:
    Ich war mir eben so sicher, aber ich hab wohl was durcheinander gebracht, weil meine eigene library nicht dem neusten quellcode stand entsprach 😛 (das codebeispiel ist aus einer eigenen library, die ich in einem anderen projekt unit-testing unterziehe)

    dass da 0 raus kam lag nicht an dem cast beim return, sondern daran:

    float GeometryHelper::pointLineShortestDistance(...)
    {
        // ...
    
        float tmp1, tmp2;
        tmp1 = (vec_AP.x * vec_normal.x);
        tmp2 = (vec_AP.y * vec_normal.y);
    
        return (tmp1 + tmp2);
    }
    

    ich hatte mit zwischenergebnissen vom typ float gerechnet... deshalb kam 0 raus. es war also die ganze zeit float 🙄

    trotzdem danke an alle 🙂 ist schön zu sehen wie schnell einem hier geholfen wird!


Anmelden zum Antworten