ifort 的 C 的实际大小标志等价物

Posted

技术标签:

【中文标题】ifort 的 C 的实际大小标志等价物【英文标题】:ifort's real-size flag equivalent for C 【发布时间】:2014-06-10 06:03:53 【问题描述】:

gcccl 是否有等效于 ifort real-size 编译器标志?如果没有,我应该改用什么?宏?

#ifdef DOUBLE_PRECISION
  #define REAL double
#else
  #define REAL float
#endif
REAL myvar;

【问题讨论】:

【参考方案1】:

gfortran 有编译时选项-fdefault-real-8。但不是 gcc。

【讨论】:

谢谢,也许问题不是很清楚,但我想编译C代码,而不是Fortran代码。【参考方案2】:

据我所知,没有可以通过编译器开关控制大小的“通用浮点数”。我们使用与您类似的方法,尽管使用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 编译器。

【讨论】:

以上是关于ifort 的 C 的实际大小标志等价物的主要内容,如果未能解决你的问题,请参考以下文章

ifort 中的标志 -r8 会影响声明为 real*4 的变量吗?

数学计算 的bug:(理论)数学上等价,实际运行未必等价

[2018雅礼集训1-16]方阵

在c语言里,if (x)等价于if (x!=0)、if (!x)等价于if (x==0)吗?

C++ DWORD 的 C# 等价物是啥?

Python 中的 C _IOR 函数的等价物是啥?