Pregunta

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

¿Es solo una elección de desarrollo que decidieron los desarrolladores de C o hay alguna razón para ello?Creo que un flotante es más pequeño que un doble, por lo que podría ser para evitar desbordamientos causados ​​por no saber qué formato decimal usar.¿Es esa la razón o estoy pasando por alto algo?

¿Fue útil?

Solución

Creo que el motivo es garantizar que se pueda abarcar cualquier resultado.por lo que la elección natural es doble ya que es el tipo de datos más grande.

Otros consejos

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

En esta expresión, 5.0, 9.0, y 32.0 son doubles.Ese es el tipo predeterminado para una constante de punto flotante, si desea que sean floats, entonces usarías el F sufijo:

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

Tenga en cuenta que si fahr era un double, entonces el resultado de esta última expresión sería aún ser un double:Como señaló Vaibhav, los tipos se promueven de tal manera que se evite una posible pérdida de precisión.

La razón por la que la expresión se convierte en doble precisión es porque los literales especificados son valores de doble precisión de forma predeterminada.Si especifica los literales utilizados en la ecuación como flotantes, la expresión devolverá un flotante.Considere el siguiente código (Mac OS X usando 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);
}

La salida es:

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

Las constantes de coma flotante deben tener la mayor precisión disponible.El resultado se puede asignar a un flotador sin demasiados problemas.

En la época de K&Rv1, se animaba a utilizar float/double indistintamente ya que todas las expresiones con tipos de punto flotante siempre se evaluaban usando representación "doble", un problema en los casos en los que la eficiencia es primordial.Una constante de coma flotante sin el sufijo f, F, l o L es de tipo doble.Y, si la letra f o F es el sufijo, la constante es de tipo float.Y si tiene el sufijo l o L, es de tipo long double.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top