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?

È stato utile?

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 doubleS.Questo è il tipo predefinito per una costante in virgola mobile, se lo desideri floats, 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top