开发者

Assign double constant to float variable without warning in C?

In C programming language, the floating point constant is double type by default

so 3.1415 is double type, unless use 'f' or 'F' suffix to indicate float type.

I assume const float pi = 3.1415 will cause a warning, but actually not.

when I try these under gcc with -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);  

the result is:

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

the result (including double variable) obviously lose precision, but compile without any warning.

so what did the compiler do with this? or did I misunderstand something?


-Wall does not enable warnings about loss of precision, truncation of values, etc. because these warnings are annoying noise and "fixing" them requires cluttering correct code with heaps of ugly casts. If you want warnings of this nature you need to enable them explicitly.

Also, your use of printf has nothing to do with the precision of the actual variables, just the precision printf is printing at, which defaults to 6 places after the decimal point.


%f can be used with float and double. If you want more precision use

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

And this is what's going on under the hood:

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); 


If you want to get warnings for this, I believe that -Wconversion flags them in mainline gcc-4.3 and later.

If you happen to use OS X, -Wshorten-64-to-32 has been flagging them in Apple's GCC since gcc-4.0.1. I believe that clang matches the mainline gcc behavior, however.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜