celsius = (5.0/9.0) * (fahr-32.0);
这只是C开发人员决定的开发选择还是有理由这样做?我相信浮点数小于一个浮点数,因此可能是为了防止因不知道使用哪种十进制格式而导致的溢出。这是原因,还是我忽略了什么?
答案 0 :(得分:26)
celsius = (5.0/9.0) * (fahr-32.0);
在此表达式中,5.0
,9.0
和32.0
为double
。这是浮点常量的默认类型 - 如果您希望它们是float
s,那么您将使用F
后缀:
celsius = (5.0F/9.0F) * (fahr-32.0F);
请注意,如果fahr
是double
,那么最后一个表达式的结果仍然为double
:正如Vaibhav所说,类型被提升以避免可能失去精确度的方式。
答案 1 :(得分:4)
我认为原因是确保可以包含任何结果。所以自然选择是双倍的,因为它是最大的数据类型。
答案 2 :(得分:3)
表达式转换为双精度的原因是默认情况下指定的文字是双精度值。如果将等式中使用的文字指定为浮点数,则表达式将返回浮点数。请考虑以下代码(使用gcc 4.01的Mac OS X)。
#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);
}
输出是:
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
答案 3 :(得分:1)
浮点常量应具有可用的最高精度。可以将结果分配给浮点数而不会出现过度麻烦。
答案 4 :(得分:1)
在K&amp; Rv1的那一天,鼓励使用float / double互换,因为所有带有浮点类型的表达式总是使用“double”表示来评估,这是效率至关重要的问题。没有f,F,l或L后缀的浮点常量是double类型。并且,如果字母f或F是后缀,则常量是float类型。如果以字母l或L为后缀,则为long double类型。