Create an account

Very important

  • To access the important data of the forums, you must be active in each forum and especially in the leaks and database leaks section, send data and after sending the data and activity, data and important content will be opened and visible for you.
  • You will only see chat messages from people who are at or below your level.
  • More than 500,000 database leaks and millions of account leaks are waiting for you, so access and view with more activity.
  • Many important data are inactive and inaccessible for you, so open them with activity. (This will be done automatically)


Thread Rating:
  • 804 Vote(s) - 3.51 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Assign double constant to float variable without warning in C?

#1
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?
Reply

#2
`%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);
Reply

#3
`-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.
Reply

#4
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.
Reply



Forum Jump:


Users browsing this thread:
1 Guest(s)

©0Day  2016 - 2023 | All Rights Reserved.  Made with    for the community. Connected through