Frage

celsius = (5.0/9.0) * (fahr-32.0);

Ist es nur eine Entwicklungsentscheidung, die die C-Entwickler getroffen haben, oder gibt es dafür einen Grund?Ich glaube, dass ein Float kleiner als ein Double ist. Dies könnte also dazu dienen, Überläufe zu verhindern, die dadurch verursacht werden, dass man nicht weiß, welches Dezimalformat verwendet werden soll.Liegt das daran oder übersehe ich etwas?

War es hilfreich?

Lösung

Ich denke, der Grund liegt darin, sicherzustellen, dass jedes Ergebnis erfasst werden kann.Daher ist die natürliche Wahl doppelt so hoch, da es sich um den größten Datentyp handelt.

Andere Tipps

celsius = (5.0/9.0) * (fahr-32.0);

In diesem Ausdruck 5.0, 9.0, Und 32.0 Sind doubleS.Das ist der Standardtyp für eine Gleitkommakonstante – wenn Sie das wünschen floats, dann würden Sie das verwenden F Suffix:

celsius = (5.0F/9.0F) * (fahr-32.0F);

Beachten Sie, dass wenn fahr war ein double, dann wäre das Ergebnis dieses letzten Ausdrucks Trotzdem sei ein double:Wie Vaibhav feststellte, werden Typen so hochgestuft, dass potenzielle Präzisionsverluste vermieden werden.

Der Grund dafür, dass der Ausdruck in doppelte Genauigkeit umgewandelt wird, liegt darin, dass die angegebenen Literale standardmäßig Werte mit doppelter Genauigkeit sind.Wenn Sie die in der Gleichung verwendeten Literale als Gleitkommazahlen angeben, gibt der Ausdruck eine Gleitkommazahl zurück.Betrachten Sie den folgenden Code (Mac OS X mit gcc 4.01).

#include <stdio.h>
int main() {
  float celsius;
  float fahr = 212;
  printf("sizeof(celsius) ---------------------> %d\n", sizeof(celsius));
  printf("sizeof(fahr) ------------------------> %d\n", sizeof(fahr));
  printf("sizeof(double) ----------------------> %d\n", sizeof(double));
  celsius = (5.0f/9.0f) * (fahr-32.0f);
  printf("sizeof((5.0f/9.0f) * (fahr-32.0f)) --> %d\n", sizeof((5.0f/9.0f) * (fahr-32.0f)));
  printf("sizeof((5.0/9.0) * (fahr-32.0)) -----> %d\n", sizeof((5.0/9.0) * (fahr-32.0)));
  printf("celsius -----------------------------> %f\n", celsius);
}

Die Ausgabe lautet:

sizeof(celsius) ---------------------> 4
sizeof(fahr) ------------------------> 4
sizeof(double) ----------------------> 8
sizeof((5.0f/9.0f) * (fahr-32.0f)) --> 4
sizeof((5.0/9.0) * (fahr-32.0)) -----> 8
celsius -----------------------------> 100.000008

Gleitkommakonstanten sollten die höchste verfügbare Genauigkeit haben.Das Ergebnis kann problemlos einem Float zugeordnet werden.

Zu Zeiten von K&Rv1 wurde empfohlen, float/double austauschbar zu verwenden, da alle Ausdrücke mit Gleitkommatypen immer mithilfe der „double“-Darstellung ausgewertet wurden, ein Problem in Fällen, in denen Effizienz im Vordergrund steht.Eine Gleitkommakonstante ohne das Suffix f, F, l oder L ist vom Typ double.Und wenn der Buchstabe f oder F das Suffix ist, ist die Konstante vom Typ float.Und wenn der Buchstabe l oder L angehängt ist, ist es vom Typ Long Double.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top