为什么这个C代码会产生一个double而不是float?
问题描述:
celsius = (5.0/9.0) * (fahr-32.0);
为什么这个C代码会产生一个double而不是float?
这只是C开发人员决定的还是有其原因的开发选择?我相信浮点数比double小,所以它可能是防止由于不知道使用什么十进制格式而导致的溢出。是这个原因,还是我忽略了一些东西?
答
我认为原因是要确保任何结果都可以包含在内。所以自然选择是双倍的,因为它是最大的数据类型。
答
浮点常量应具有可用的最高精度。结果可以被分配给一个浮点数而不会带来麻烦。
答
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指出,类型的提升方式,以避免可能失去精度。
答
将表达式转换为双精度的原因是因为缺省情况下指定的文字是双精度值。如果您将等式中使用的文字指定为浮点数,则表达式将返回浮点数。考虑下面的代码(使用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
答
返回以K & RV1的那天起,就被鼓励使用浮点/双精度互换感与浮点类型的所有表达式使用总是评价`双'表示,在效率至高的情况下是一个问题。没有f,F,l或L后缀的浮点常量是double类型的。而且,如果字母f或F是后缀,则该常量的类型为float。如果后缀为字母l或L,则为long double类型。
自然选择是双倍的唯一原因是因为@ Shog9说:数学中有双打,所以它被评估为双倍。 – user7116 2009-08-20 15:43:26
“长双倍”可能比“双倍”具有更大的范围和精度,因此是更大的候选数据类型。 – chux 2013-07-16 13:32:00