XunnD schrieb:
Wetten würde ich darauf nicht! Meine Erfahrung gleicht der von dazpoon. %lf ist double, %f float.
Ich hatte es vor meiner Antwort extra im C-Standard nachgeschlagen.
Allerdings bezieht sich das nur auf fprintf, wie ich jetzt auch festgestellt habe (hatte nicht bis fscanf gelesen, sondern bei fprintf aufgehört):
%f ist double, %Lf (Achtung, case) ist long double. Vom l(ell)-Modifier (also %lf) wird bei fprintf explizit erwähnt, dass er keinen Einfluss hat.
Nachzulesen unter 7.19.6.1, Satz 8 und 7.
Bei fscanf erwartet %f tatsächlich ein float und bei %lf ein double.
Im Standard steht zu %f nur lapidar "The corresponding argument shall be a pointer to floating." (7.19.6.2, Satz 12). Allerdings steht beim l(ell)-Modifier, dass dann ein double erwartete wird. long double bekommt man mit dem L-Modifier (7.19.6.2, Satz 11).
Das Beispiel unter 7.19.6.2, Satz 17/18 verdeutlicht auch, dass tatsächlich float gemeint ist.
Finde ich insgesamt gerade etwas inkonsistent... *confused*
(achso: printf entspricht fprintf mit stdout als erstem Argument, scanf entspricht fscanf mit stdin als erstem Argument)
Edit:
Gerade selbst dazugelernt: Der Grund für die "Anomalie" von %f in fprintf ist, dass in einer Ellipse (...) in der Argumentliste jeder float automatisch zu double umgewandelt wird. Bei Pointern (bei fscanf) ist das natürlich nicht der Fall, da man ja einen Pointer auf float und keinen Float selbst hat. Steht unter 6.5.2.2, Satz 8.
Ein expliziter Cast nach float ist also insofern wirkungslos, weil der Wert danach direkt wieder in einen Double umgewandelt wird. Höchstens die Präzision könnte davon beeinflusst werden, was üblicherweise aber trotzdem nicht passiert, weil Compiler i.d.R. den Wert einfach im Register behalten. Beim GCC lässt sich die Rundung aber mit -fstore-floats IEEE-konform erzwingen.
Und noch ein Edit:
Aus den FAQ von comp.lang.c zu scanf (da steht nochmal das gleiche drin):
http://c-faq.com/stdio/scanf2.html
http://c-faq.com/stdio/scanfvsprintf.html
Hm und das Ursprungsprogramm war hinsichtlich %f also doch richtig. Sorry.
