C-Programmierung/Leap 15.1: Funktion fmax(x,y) liefert nicht das Maximum

Hinweis: In dem Thema C-Programmierung/Leap 15.1: Funktion fmax(x,y) liefert nicht das Maximum gibt es 1 Antwort.
  • Ich arbeite mit C unter Leap 15.1, die C-Funktion fmax tut nicht, was sie tun sollte:

    das C-Programm fmax_test.c


    #include <stdio.h>

    #include <math.h>


    int main()

    {

    double t1, t2, t3;


    t1 = (double)-1.0;

    t2 = (double)100.0;

    t3 = fmax( -1.0, 100.0 );


    printf("\nt1=%+.2lE t2=%+.2lE t3=%+.2lE fmax(t1,t2)= %+.2lE\n\n",t1,t2,t3,fmax( t1, t2));


    return;

    }


    übersetzt mit dem Kommando

    gcc -ansi -pedantic fmax_test.c -o fmax_test.exe -lm


    liefert bei Ausführung mit dem Kommando "./fmax_test.exe" als Ausgabe die Zeile

    t1=-1.00E+00 t2=+1.00E+02 t3=+2.00E+00 fmax(t1,t2)= +3.23E-319


    Sehr überraschend: die Auswertung von fmax in printf liefert einen anderen (aber ebenfalls inkorrekten!) Wert als die Auswertung außerhalb (Variable t3)!

    Ich bin ratlos, was läuft hier falsch bzw. wie geht es richtig?


    Danke für jeden Hinweis!


    Franz Polster

  • Das hat mich jetzt auch überrascht und deshalb hab ich mal nachgeforscht. Es sieht so aus, als ob die Funktion fmax in math.hnicht definiert wird, wenn -ansi angegeben ist. Das kann man erkennen, wenn man den Compiler mal mit der Option -E -o fmax_test.preprocessed.c aufruft und das Ergebnis nach dem Preprocessor anschaut: keine Spur einer Definition von fmax.


    ANSI C nimmt in einem solchen Fall an, dass die fmax als int fmax(int,int) definiert ist, und das ergibt den von dir gezeigten Effekt.Ich hab dein Programm nun mal mit der Deklaration double fmax(double,double); vor der main ergänzt, und schon geht alles wie erwartet.


    Hier hatte jemand schon vor Jahren diese Frage: https://stackoverflow.com/ques…laration-of-function-fmax

    Und die Antwort ist auch hier, dass fmax mindestens C99 erfordert, um in math.h deklariert zu werden.


    Das scheint auch korrekt zu sein. Zumindest führt https://de.wikipedia.org/wiki/Math.h die Funktion fmax nicht in der Liste der bis C95 definierten Funktionen auf,