【发布时间】:2014-06-10 06:03:53
【问题描述】:
gcc 和 cl 是否有等效于 ifort real-size 编译器标志?如果没有,我应该改用什么?宏?
#ifdef DOUBLE_PRECISION
#define REAL double
#else
#define REAL float
#endif
REAL myvar;
【问题讨论】:
标签: c fortran intel-fortran compiler-flags
gcc 和 cl 是否有等效于 ifort real-size 编译器标志?如果没有,我应该改用什么?宏?
#ifdef DOUBLE_PRECISION
#define REAL double
#else
#define REAL float
#endif
REAL myvar;
【问题讨论】:
标签: c fortran intel-fortran compiler-flags
gfortran 有编译时选项-fdefault-real-8。但不是 gcc。
【讨论】:
据我所知,没有可以通过编译器开关控制大小的“通用浮点数”。我们使用与您类似的方法,尽管使用typedef 而不是define:
#ifdef DOUBLE_PRECISION
typedef double real;
#else
typedef float real;
#endif
不过,它不仅仅是浮点类型。例如,考虑以下函数签名:
double exp(double x);
float expf(float x);
long double expl(long double x);
每个函数都有一个后缀,表示参数和返回值的类型。或者考虑浮点文字的类型:
1.2f // float
1.2 // double
如果您想安全起见,您也必须为这些情况编写宏:
#ifdef DOUBLE_PRECISION
#define REAL(x) x
#define SIN(x) sin(x)
#else
#define REAL(x) x ## f
#define SIN(x) sinf(x)
#endif
在实践中,我发现启用优化(-O2 或更多)后,编译器会计算出最佳的函数签名以及用于文字的类型,因此我只使用未经修饰的函数和文字,以免使代码混乱。这似乎适用于 gcc 以及 Intel 和 PGI 编译器。
【讨论】: