Ich frage mich, was der Unterschied zwischen diesen beiden Variablen in C ist:
float price = 3.00;
und
float price = 3.00f;
Was ist die Verwendung von Suffix f
in diesem Fall?
Ich frage mich, was der Unterschied zwischen diesen beiden Variablen in C ist:
float price = 3.00;
und
float price = 3.00f;
Was ist die Verwendung von Suffix f
in diesem Fall?
Antworten:
3.00
wird als a interpretiert double
, im Gegensatz dazu 3.00f
wird dies vom Compiler als a angesehen float
.
Das f
Suffix teilt dem Compiler einfach mit, welches a float
und welches a ist double
.
Siehe MSDN (C ++)
float price = 7.50 / 2.50;
gegenüber haben, kann float price = 7.50f / 2.50f;
das Ergebnis aufgrund der unterschiedlichen Auflösung abweichen. Im ersten Fall muss der Compiler die Berechnung durchführen und double
dann das Ergebnis in konvertieren float
. Im zweiten Fall erfolgt die Berechnung in float
. Beachten Sie, dass wenn nur ein Wert ist, double
das Ganze als berechnet wird double
. Der C-Compiler darf dies nicht optimieren, da sich die Rundung unterscheiden würde. Also floatvarA = floatvarB / 2.0
schlechter abschneidet als mit 2.0f
.
Zusätzlich zu dem, was bereits gesagt wurde, ist es wichtiger, den Überblick über 1.0 gegenüber 1.0f zu behalten, als viele Menschen erkennen. Wenn Sie Code wie folgt schreiben:
float x;
...
float y = x * 2.0;
Dann wird x zu einem Double befördert, da 2.0 ein Double ist. Der Compiler darf diese Heraufstufung nicht optimieren, da dies sonst gegen den C-Standard verstoßen würde. Die Berechnung erfolgt mit doppelter Genauigkeit, und das Ergebnis wird implizit in einen Float abgeschnitten. Dies bedeutet, dass die Berechnung langsamer (wenn auch genauer) ist als wenn Sie 2.0f oder 2 geschrieben hätten.
Wenn Sie 2 geschrieben hätten, wäre die Konstante vom Typ int, der zu einem Float heraufgestuft würde, und die Berechnung wäre mit "Float-Präzision" durchgeführt worden. Ein guter Compiler würde Sie vor dieser Aktion warnen.
Lesen Sie hier mehr über die Regeln für die "übliche arithmetische Konvertierung":
http://msdn.microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx
float y = x * 2.0;
. Tatsächlich generiert ein Compiler, der sein Geld wert ist, eine Multiplikation mit einfacher Genauigkeit float y = x * (double)0.1f;
, eine viel beeindruckendere Leistung (aber immer noch eine korrekte Optimierung).
double
Multiplikation mit 2.0
und nicht durchzuführen 2.0f
. Compiler dürfen keine Optimierung verwenden, die das numerische Ergebnis ändern würde.
(float)((double)float_x * (double)float_y) == float_x * float_y
eine Gleichheit, die der Compiler für diese Optimierung umgekehrt anwendet. Dies funktioniert, weil die Näherungen von 2 als double
und float
identisch sind.
Denn durch nicht angehängte Gleitkomma-Literale werden Doppelte verwendet, und Rundung bedeutet, dass selbst kleine Literale unterschiedliche Werte annehmen können, wenn sie auf Gleitkomma- und Doppelrundungen gerundet werden. Dies kann im folgenden Beispiel beobachtet werden:
float f=0.67;
if(f == 0.67)
printf("yes");
else
printf("no");
Dies wird ausgegeben no
, da 0.67
es einen anderen Wert hat, wenn es auf Float gerundet wird, als wenn es auf Double gerundet wird. Auf der anderen Seite:
float f=0.67;
if(f == 0.67f)
printf("yes");
else
printf("no");
Ausgänge yes
.
Das Suffix kann entweder in Groß- oder Kleinbuchstaben angegeben werden.
Versuchen Sie dies auch:
printf(" %u %u\n", sizeof(.67f), sizeof(.67));
Überprüfen Sie @ Codepade
Dies liegt daran, dass der Standardtyp eines numerischen Gleitkomma-Literals - die Zeichen 3.00 sind doppelt und nicht float. Um dies zu kompilieren, müssen Sie das Suffix f (oder F) hinzufügen.
Hinzufügen einiger weiterer Kombinationen von Vergleichen zwischen Float- und Double-Datentypen.
int main()
{
// Double type constant(3.14) converts to Float type by
// truncating it's bits representation
float a = 3.14;
// Problem: float type 'a' promotes to double type and the value
// of 'a' depends on how many bits added to represent it.
if(a == 3.14)
std::cout<<"a: Equal"<<std::endl;
else
std::cout<<"a: Not Equal"<<std::endl;
float b = 3.14f; // No type conversion
if(b == 3.14) // Problem: Float to Double conversion
std::cout<<"b: Equal"<<std::endl;
else
std::cout<<"b: Not Equal"<<std::endl;
float c = 3.14; // Double to Float conversion (OK even though is not a good practice )
if(c == 3.14f) // No type conversion
std::cout<<"c: Equal"<<std::endl; // OK
else
std::cout<<"c: Not Equal"<<std::endl;
float d = 3.14f;
if(d == 3.14f)
std::cout<<"d: Equal"<<std::endl; // OK
else
std::cout<<"d: Not Equal"<<std::endl;
return 0;
}
Ausgabe:
a: Not Equal
b: Not Equal
c: Equal
d: Equal
Oft ist der Unterschied nicht wichtig, da der Compiler die Doppelkonstante ohnehin in einen Float umwandelt. Beachten Sie jedoch Folgendes:
template<class T> T min(T a, T b)
{
return (a < b) ? a : b;
}
float x = min(3.0f, 2.0f); // will compile
x = min(3.0f, 2); // compiler cannot deduce T type
x = min(3.0f, 2.0); // compiler cannot deduce T type