Warum habe ich im angegebenen Programm unterschiedliche Ergebnisse für jedes der printf
s erhalten?
#include <stdio.h>
int main()
{
float c = 4.4e10;
printf("%f\n", c);
printf("%f\n", 4.4e10);
return 0;
}
Und es zeigt die folgende Ausgabe:
44000002048.000000
44000000000.000000
4.4e10
einedouble
Konstante ist,float
in die bei der Initialisierung von konvertiert wird, diec
jedoch beibehalten wird,double
wenn sie an übergeben wirdprintf
. Möglicherweise möchten Sie jedoch auch wissen, dass das Hinzufügen einesf
Suffixes einefloat
Konstante darstellt: Beim Drucken4.4e10f
wird derselbe Wert angezeigt, der sich aus der Initialisierungc
auf ergibt4.4e10f
. Die Unterscheidung vonfloat
Konstanten vondouble
Konstanten kann wichtig sein, um Qualitätsarbeiten mit Gleitkomma-Arithmetik durchzuführen.double
nachfloat
in der Sprache C erfolgt? Oder möchten Sie wissen, welche Werte sich aus der Konvertierung ergeben, dh welche Auswirkungen die Konvertierung hat? Oder etwas anderes?C
wirprintf("%f",x)
für afloat
undprintf("%lf",x)
für a verwendetdouble
. Wann haben sich die Dinge geändert? Und wie würde man explizit ein (einzelnes) druckenfloat
-printf("%hf",x)
??%lf
in printf ist das gleiche wie%f
. Einfloat
Argument in einer Variablen wirddouble
vom Compiler in ein Argument konvertiert , genau wie ein Argumentshort
in einint
.Antworten:
A
float
ist ein Typ, der eine 32-Bit-Gleitkommazahl enthält, während die Konstante4.4e10
a darstelltdouble
, die eine 64-Bit-Gleitkommazahl enthält (dh eine Gleitkommazahl mit doppelter Genauigkeit).Wenn Sie zuweisen
4.4e10
,c
kann der Wert4.4e10
nicht genau dargestellt werden (ein Rundungsfehler in einem Parameter namens Mantisse), und der nächstmögliche Wert (44000002048) wird gespeichert. Wenn es zu übergeben wirdprintf
, wird sie gefördert zurück zudouble
, einschließlich der Rundungsfehler.Im zweiten Fall ist der Wert
double
die ganze Zeit a, ohne sich zu verengen und zu erweitern, und es ist zufällig der Fall, dass adouble
den Wert genau darstellen kann.Wenn dies ein unerwünschtes Verhalten ist, können Sie dies
c
alsdouble
etwas präziser deklarieren (achten Sie jedoch darauf, dass Sie eventuell immer noch an die Genauigkeitsgrenzen stoßen).quelle
Sie drucken hier tatsächlich die Werte von zwei verschiedenen Typen.
Im ersten Fall weisen Sie einer Variablen vom Typ einen Wert zu
float
. Die Genauigkeit von afloat
beträgt ungefähr 6 oder 7 Dezimalstellen. Wenn der Wert nicht genau dargestellt werden kann, wird der nächstgelegene Wert angezeigt, der von diesem Typ dargestellt werden kann.Im zweiten Fall übergeben Sie die Konstante vom
4.4e10
Typdouble
. Dieser Typ hat eine Genauigkeit von ca. 16 Dezimalstellen, und der Wert liegt innerhalb dieses Bereichs, sodass der genaue Wert gedruckt wird.quelle