为什么此C代码产生一个double而不是float?
时间:2020-03-05 18:46:04 来源:igfitidea点击:
摄氏=(5.0 / 9.0)*(fahr-32.0);`
是C开发人员决定的只是开发选择,还是有原因?我认为浮点数小于双精度数,因此它可能是为了防止由于不知道使用哪种十进制格式而引起的溢出。是这个原因,还是我忽略了某些东西?
解决方案
回答
我认为原因是要确保可以涵盖任何结果。因此自然选择是两倍,因为它是最大的数据类型。
回答
浮点常量应具有最高的精度。可以将结果分配给float,而不会造成不必要的麻烦。
回答
celsius = (5.0/9.0) * (fahr-32.0);
在这个表达式中," 5.0"," 9.0"和" 32.0"是" double"。如果想让它们成为浮点数,则这是浮点常量的默认类型,那么我们可以使用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类型。