I have a lengthy numeric integration scheme written in C. I'd like to test my algorithm in floating point precision. Is there a way to tell gcc to demote every occurrence of double
to float
in the entire program?
Double is more precise than float and can store 64 bits, double of the number of bits float can store. Double is more precise and for storing large numbers, we prefer double over float. For example, to store the annual salary of the CEO of a company, double will be a more accurate choice.
The default choice for a floating-point type should be double . This is also the type that you get with floating-point literals without a suffix or (in C) standard functions that operate on floating point numbers (e.g. exp , sin , etc.).
double has higher precision, whereas floats take up less memory and are faster. In general you should use float unless you have a case where it isn't accurate enough. On typical modern computers, double is just as fast as float.
You can't safely do this without modifying your source code, but that shouldn't be terribly difficult to do.
Using the preprocessor to force the keyword double
in your program to be treated as float
is a bad idea; it will make your program difficult to read, and if you happen to use long double
anywhere it would be treated as long float
, which is a syntax error.
As stix's answer suggests, you can add a typedef
, either at the top of your program (if it's a single source file) or in some header that's #include
ed by all the relevant source files:
typedef double real; /* or pick a different name */
Then go through your source code and change each occurrence of double
to real
. (Be careful about doing a blind global search-and-replace.)
Make sure that the program still compiles, runs, and behaves the same way after this change. Then you can change the typedef to:
typedef float real;
and recompile to use float
rather than double
.
It's not quite that simple, though. If you're using functions declared in <math.h>
, you'll want to use the right function for whatever floating-point type you're using; for example, sqrt()
is for double
, sqrtf()
is for float
, and sqrtl()
is for long double
.
If your compiler supports it, you might use the <tgmath.h>
header, which defines type-generic macros corresponding to the math functions from <math.h>
. If you use <tgmath.h>
, then sqrt(x)
will resolve to call the correct square root function depending on the type of the argument.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With