Zuweisen double-Konstante float-Variablen ohne Warnung in C?
In der Programmiersprache C, die Gleitkomma-Konstante double-Typ standardmäßig
so 3.1415
ist doppelter Art, es sei denn, verwenden Sie 'f' oder 'F' suffix angeben, float-Typ.
Ich gehe davon aus const float pi = 3.1415
wird zu einer Warnung führen, aber eigentlich nicht.
wenn ich versuche, diese unter gcc mit -Wall:
float f = 3.1415926;
double d = 3.1415926;
printf("f: %f\n", f);
printf("d: %f\n", d);
f = 3.1415926f;
printf("f: %f\n", f);
int i = 3.1415926;
printf("i: %d\n", i);
ist das Ergebnis:
f: 3.141593
d: 3.141593
f: 3.141593
i: 3
Ergebnis (einschließlich double-Variablen) offensichtlich verlieren die Präzision, aber das kompilieren, ohne jede Vorwarnung.
was hat der compiler damit machen?" oder habe ich da etwas missverstehen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
-Wall
nicht aktivieren Warnungen über den Verlust von Präzision, abschneiden von Werten, etc. weil diese Warnungen sind störende Geräusche und "fixieren" Sie erfordert überladen richtigen code mit haufenweise hässliche casts. Wenn Sie möchten, dass Warnungen dieser Art, die Sie benötigen, um Ihnen zu ermöglichen, ausdrücklich zu.Auch, Ihre Nutzung der
printf
hat nichts zu tun mit der Präzision der eigentlichen Variablen, nur die Präzisionprintf
ist-Druck an, die standardmäßig auf 6 stellen nach dem Dezimalpunkt.printf
sorgt für die Schwimmer sind implizit cast verdoppelt, wenn übergeben?float
um den compiler glücklich, auch Kräfte zufloat
etwas, das nicht sollte [z.B.const float oneTenth = 1.0f/10.0f; float value1 = 8.0f * oneTenth; double value2 = 4.0f * oneTenth;
Beachten Sie, dass, wennoneTenth
hättedouble
wäre alles perfekt funktioniert.%f
können verwendet werdenfloat
unddouble
. Wenn Sie möchten, dass mehr Präzision verwenden SieUnd das ist, was Los ist unter der Haube:
%lf
für ein Doppelzimmer?f
sind fürscanf
aber das gleiche inprintf
Wenn Sie möchten, um Warnungen für das ist, glaube ich, dass
-Wconversion
flags, die Sie in den mainline-gcc-4.3 und höher.Wenn Sie geschehen, die zur Verwendung von OS X,
-Wshorten-64-to-32
wurde, Kennzeichnen Sie Sie im Apple-GCC, da gcc-4.0.1. Ich glaube, dass das Geräusch passt die Standard-gcc-Verhalten, jedoch.