Perché questo codice C produce un double invece di un float?
Domanda
celsius = (5.0/9.0) * (fahr-32.0);
È solo una scelta di sviluppo presa dagli sviluppatori C o c'è una ragione per questo?Credo che un float sia più piccolo di un double, quindi potrebbe essere necessario per evitare overflow causati dalla non conoscenza del formato decimale da utilizzare.E' questo il motivo o sto trascurando qualcosa?
Soluzione
Penso che il motivo sia quello di garantire che qualsiasi risultato possa essere raggiunto.quindi la scelta naturale è doppia poiché è il tipo di dati più grande.
Altri suggerimenti
celsius = (5.0/9.0) * (fahr-32.0);
In questa espressione, 5.0
, 9.0
, E 32.0
Sono double
S.Questo è il tipo predefinito per una costante in virgola mobile, se lo desideri float
s, allora dovresti usare il file F
suffisso:
celsius = (5.0F/9.0F) * (fahr-32.0F);
Tieni presente che se fahr
era un double
, allora il risultato di quest'ultima espressione sarebbe Ancora essere un double
:come ha notato Vaibhav, i tipi vengono promossi in modo tale da evitare una potenziale perdita di precisione.
Il motivo per cui l'espressione viene convertita in precisione doppia è perché i valori letterali specificati sono valori a precisione doppia per impostazione predefinita.Se specifichi i valori letterali utilizzati nell'equazione come float, l'espressione restituirà un float.Considera il seguente codice (Mac OS X che utilizza 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);
}
L'output è:
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
Le costanti in virgola mobile dovrebbero avere la massima precisione disponibile.Il risultato può essere assegnato a un float senza eccessivi problemi.
Ai tempi di K&Rv1, era incoraggiato l'uso intercambiabile di float/double poiché tutte le espressioni con tipi a virgola mobile venivano sempre valutate utilizzando la rappresentazione "double", un problema nei casi in cui l'efficienza è fondamentale.Una costante a virgola mobile senza suffisso f, F, l o L è di tipo double.E, se la lettera fo F è il suffisso, la costante è di tipo float.E se ha come suffisso la lettera l o L, è di tipo long double.