OnTheEasiestWay
OnTheEasiestWay

Reputation: 449

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?

Upvotes: 8

Views: 10999

Answers (3)

Stephen Canon
Stephen Canon

Reputation: 106247

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.

Upvotes: 2

R.. GitHub STOP HELPING ICE
R.. GitHub STOP HELPING ICE

Reputation: 215367

-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.

Upvotes: 6

Jacob
Jacob

Reputation: 34621

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

Upvotes: 2

Related Questions