在C中没有警告的情况下将double常量赋给float变量?

时间:2011-06-30 17:34:22

标签: c floating-point

在C编程语言中,默认情况下浮点常量为double类型 所以3.1415是双重类型,除非使用'f'或'F'后缀来表示浮点类型。

我认为const float pi = 3.1415会引发警告,但事实并非如此。

当我在gcc下用-Wall尝试这些:

float f = 3.1415926;  
double d = 3.1415926;  
printf("f: %f\n", f);  
printf("d: %f\n", d);  
f = 3.1415926f;  
printf("f: %f\n", f);  
int i = 3.1415926;  
printf("i: %d\n", i);  

结果是:

f: 3.141593  
d: 3.141593  
f: 3.141593  
i: 3

结果(包括双变量)显然会失去精度,但编译时没有任何警告 那么编译器对此做了什么?还是我误解了什么?

3 个答案:

答案 0 :(得分:7)

-Wall不会启用关于精度损失,值截断等的警告,因为这些警告是恼人的噪音并且“修复”它们需要使用大量丑恶的演员表混乱正确的代码。如果您需要此类警告,则需要明确启用它们。

此外,您对printf的使用与实际变量的精度无关,只是精度printf正在打印,默认为小数点后的6位。

答案 1 :(得分:2)

%f可与floatdouble一起使用。如果你想要更精确的使用

printf("f: %.16f",d);

这就是幕后发生的事情:

float f = 3.1415926;  // The double 3.1415926 is truncated to float
double d = 3.1415926;  
printf("f: %f\n", f);  
printf("d: %f\n", d);  
f = 3.1415926f;       // Float is specified
printf("f: %f\n", f);  
int i = 3.1415926;    // Truncation from double to int
printf("i: %d\n", i); 

答案 2 :(得分:1)

如果您想收到警告,我相信-Wconversion会在主线gcc-4.3及更高版本中标记它们。

如果您碰巧使用OS X,那么自{gcc-4.0.1}以来,-Wshorten-64-to-32一直在Apple的GCC中标记它们。不过,我认为clang与主线gcc行为相匹配。