在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
结果(包括双变量)显然会失去精度,但编译时没有任何警告 那么编译器对此做了什么?还是我误解了什么?
答案 0 :(得分:7)
-Wall
不会启用关于精度损失,值截断等的警告,因为这些警告是恼人的噪音并且“修复”它们需要使用大量丑恶的演员表混乱正确的代码。如果您需要此类警告,则需要明确启用它们。
此外,您对printf
的使用与实际变量的精度无关,只是精度printf
正在打印,默认为小数点后的6位。
答案 1 :(得分:2)
%f
可与float
和double
一起使用。如果你想要更精确的使用
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行为相匹配。