Fließkommazahlen-Konstante als Übergabeparameter



  • Hallo zusammen,

    ich bitte um Nachsicht, wenn die Frage Euch total bescheuert vorkommt, aber ich versuche sie trotzdem nachvollziehbar zu stellen.

    Wenn ich eine Funktion ohne Funktionsprototypen aufrufe, die z.B. 5 Parameter des Typs float erwartet...

    float berechne (float a, float b, float c, float d, float e) { return e; }
    

    ...
    Angenommen, ich übergebe der Funktion dabei für a, b, c und e mit 0.0f befüllte float-Variablen und d als Fließkomma-Konstante 0.0 ohne F oder f...

    float fa = 0.0f;
    float fb = 0.0f;
    float fc = 0.0f;
    float fe = 0.0f;
    fe = berechne (fa, fb, fc, 0.0, fe);
    

    Wie hoch ist das Risiko, dass ich mir dabei die Variable fe zerschieße, weil 0.0 als double in die Funktion geht?

    Ich hoffe, man konnte mir folgen 🙂 Es gibt leider kaum eine Möglichkeit, den Fall im Debugger nachzustellen bzw. das Ergebnis anders zu verifizieren, deshalb baue ich auf Eure Expertise 🙂



  • Durch den Aufruf als Paramter passiert dem fe nichts. Dem fc auch nicht.

    Aber an das e in der Funktion kommst du nicht mehr ran.
    Durch die Zuweisung des Rückgabewertes, steht dann aber in fe Müll.

    Bei der Zuweisung und Definition kannst du auf das Postfix f auch verzichten.


  • Mod

    DirkB schrieb:

    Durch die Zuweisung des Rückgabewertes, steht dann aber in fe Müll.

    Ich vermute, du meinst es anders, aber für den TE wirkt die Aussage so, als wäre etwas falsch. Dabei ist alles vollkommen in Ordnung. Verschiedene Fließkommaformate (und allgemein alle arithmetischen Datentypen) werden automatisch und korrekt (im Rahmen der möglichen Genauigkeit) ineinander umgewandelt. Und eine Konstruktion

    foo = funktion(foo);
    

    ist ebenfalls absolut ok.



  • ⚠ Ohne Funktionsdeklaration (und die Definition nach main oder in anderer Datei)?

    Woher soll der Compiler dann wissen, dass nur float gewünscht ist. Die 0.0 sind doch eine double-Konstante.


  • Mod

    DirkB schrieb:

    ⚠ Ohne Funktionsdeklaration (und die Definition nach main oder in anderer Datei)?

    Oh, den kleinen Nebensatz im OP habe ich irgendwie überlesen 🙂 . Ich vergesse immer, dass in C implizite Deklarationen möglich sind, da kommt mir gar nicht der Gedanke, dass jemand danach fragen könnte. Wenn es unglücklich läuft funktioniert das sogar, da sizeof(float) auf vielen Systemen gleich sizeof(int) ist und die Fließkommarepräsentation einer 0 nur aus Nullbits besteht. Dadurch merkt man gar nicht, wie falsch das ist.



  • Ihr verwirrt mich noch mehr ;-D

    Also es gibt keinen entsprechenden Funktionsprototypen bzw. die Funktion steht in einem inkludierten File. Ich hätte wie gesagt erwartet, dass in der oben beschriebenen Konstellation der Compiler die Konstante 0.0 als double interpretiert und bei der Übergabe in eine Funktion, die dann einfach so tut, als wäre ein float übergeben worden, bin ich mir nun eben nicht sicher, ob im entsprechenden Wertebereich mit "Glück" keine Krampf rauskommt, die ganze Konstruktion grundsätzlich okay ist oder in jedem Fall mit Restmüll gerechnet werden muss...
    Genauer gesagt tritt bei Zeiten der Fall ein, dass der Wert der float-Variable, die nach der Konstanten an die Funktion übergeben wird ab einer schwankenden Zahl von Funktionsaufrufen vermüllt ist. Der wird sonst nirgends angepackt, bzw. wird sogar ab und an genullt. Als deklarierte float-Variable sollte es ja bei der Zuweisung wurst sein, ob mit 0.0 oder 0.0f genullt wird.
    Bei der Konstante könnte ich mir aber mit meinem begrenzten Wissen auch vorstellen, dass die 4 "überschüssigen" Byte des impliziten Double-Konstanten-Wertes sich irgendwo breit machen, wo sie nicht sollen 🙂 Möglich oder nicht möglich? (-:



  • Der Compiler kann sich aus dem ersten Aufruf den Prototypen bilden.
    Dann erwartet er aber bei deinem Beispiel als vierten Paramter immer ein double.
    Auch wenn du mal eine float-Variable übergibst wird die dann in double gewandelt.


Anmelden zum Antworten