5

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

这只是 C 开发人员决定的开发选择,还是有理由这样做?我相信浮点数小于双精度数,因此可能是为了防止由于不知道使用哪种十进制格式而导致的溢出。是这个原因,还是我忽略了什么?

4

5 回答 5

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

在这个表达式中5.09.0、 和32.0doubles。这是浮点常量的默认类型 - 如果您希望它们为floats,那么您将使用F后缀:

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

请注意,如果fahr是 a double,那么最后一个表达式的结果仍然是 a double:正如 Vaibhav 所指出的,类型的提升是为了避免可能丢失精度。

于 2008-09-01T18:06:24.437 回答
4

我认为原因是为了确保可以包含任何结果。所以自然选择是双倍的,因为它是最大的数据类型。

于 2008-09-01T17:51:13.553 回答
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
于 2008-09-01T18:14:40.970 回答
1

浮点常量应具有可用的最高精度。可以将结果分配给浮点数,而不会造成不必要的麻烦。

于 2008-09-01T17:51:30.433 回答
1

早在 K&Rv1 时代,就鼓励使用 float/double 互换,因为所有具有浮点类型的表达式总是使用“double”表示进行评估,这在效率至关重要的情况下会出现问题。不带 f、F、l 或 L 后缀的浮点常量是 double 类型。并且,如果字母 f 或 F 是后缀,则常量是浮点类型。如果以字母 l 或 L 为后缀,则为 long double 类型。

于 2009-08-20T15:37:01.273 回答