0

Do gcc and cl have an equivalent for ifort real-size compiler flag? If not, what should I use instead? MACRO?

#ifdef DOUBLE_PRECISION
  #define REAL double
#else
  #define REAL float
#endif
REAL myvar;
Jon Clements
  • 138,671
  • 33
  • 247
  • 280
Peter Petrik
  • 9,701
  • 5
  • 41
  • 65

2 Answers2

1

gfortran has compile-time option -fdefault-real-8. But not gcc.

M. S. B.
  • 28,968
  • 2
  • 46
  • 73
0

As far as I know there is no "universal float" whose size can be controlled with a compiler switch. We use an approach similar to yours, albeit with a typedef instead of a define:

#ifdef DOUBLE_PRECISION
    typedef double real;
#else
    typedef float real;
#endif

There's a bit more to it than just the floating-point type, however. For example, consider these function signatures:

double exp(double x);
float expf(float x);
long double expl(long double x);

Each function has a suffix denoting the type of arguments and return values. Or consider the types of floating-point literals:

1.2f   // float
1.2    // double

If you want to be on the safe side, you'd have to write macros for these cases, too:

#ifdef DOUBLE_PRECISION
    #define REAL(x) x
    #define SIN(x) sin(x)
#else
    #define REAL(x) x ## f
    #define SIN(x) sinf(x)
#endif

In practice, I've found that with optimisation switched on (-O2 or more), the compiler works out the best function signatures and which type to use for literals, so I just use unadorned functions and literals in order not to clutter the code. This seems to work for gcc and for the Intel and PGI compilers.

M Oehm
  • 28,726
  • 3
  • 31
  • 42