Pergunta

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

É apenas uma escolha de desenvolvimento que os desenvolvedores C decidiram ou há uma razão para isso?Acredito que um float é menor que um double, então pode ser para evitar estouros causados ​​por não saber qual formato decimal usar.É esse o motivo ou estou negligenciando alguma coisa?

Foi útil?

Solução

Penso que a razão é garantir que qualquer resultado possa ser abrangido.portanto, a escolha natural é dupla, pois é o maior tipo de dados.

Outras dicas

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

Nesta expressão, 5.0, 9.0, e 32.0 são doubleS.Esse é o tipo padrão para uma constante de ponto flutuante - se você quiser que elas sejam floats, então você usaria o F sufixo:

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

Observe que se fahr era um double, então o resultado desta última expressão seria ainda seja um double:como observou Vaibhav, os tipos são promovidos de forma a evitar a perda potencial de precisão.

A razão pela qual a expressão é convertida em precisão dupla é porque os literais especificados são valores de precisão dupla por padrão.Se você especificar os literais usados ​​na equação como pontos flutuantes, a expressão retornará um ponto flutuante.Considere o código a seguir (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);
}

A saída é:

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

As constantes de ponto flutuante devem ter a maior precisão disponível.O resultado pode ser atribuído a um float sem problemas desnecessários.

Na época do K&Rv1, era incentivado o uso de float/double de forma intercambiável, já que todas as expressões com tipos de ponto flutuante sempre eram avaliadas usando representação `double', um problema nos casos em que a eficiência é fundamental.Uma constante de ponto flutuante sem um sufixo f, F, l ou L é do tipo double.E, se a letra f ou F for o sufixo, a constante é do tipo float.E se tiver como sufixo a letra l ou L, é do tipo long double.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top