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

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

有帮助吗?

解决方案

我认为原因是为了确保任何结果都能被包容。因此自然选择 double,因为它是最大的数据类型。

其他提示

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

在这个表达中, 5.0, 9.0, , 和 32.0doubles。这是浮点常量的默认类型 - 如果您希望它们是 floats,那么你可以使用 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 时代,就鼓励交替使用 float/double,因为所有具有浮点类型的表达式始终使用“double”表示进行计算,这在效率至关重要的情况下会出现问题。不带 f、F、l 或 L 后缀的浮点常量是 double 类型。并且,如果字母 f 或 F 为后缀,则该常量的类型为 float。如果后缀为字母 l 或 L,则为 long double 类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top