Por que esse código C produz um double em vez de um float?
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?
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 double
S.Esse é o tipo padrão para uma constante de ponto flutuante - se você quiser que elas sejam float
s, 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.