【发布时间】:2017-03-31 12:22:27
【问题描述】:
man gcc(1) 说:选项 -ffast-math 导致预处理器宏 __FAST_MATH__被定义为。是否有关于该宏的进一步文档?
我希望这样的代码
#define __FAST_MATH__ blabla
y = pow(x,a);
#undef __FAST_MATH__
允许控制数学优化,细粒度到单个语句。
但是,我的测试表明
#define __FAST_MATH__
#define __FAST_MATH__ on
无论放在哪里,都会被忽略。
[EDIT] 即使将它们放在之前
,它们也会被忽略#include <math.h>
“忽略”的意思是:没有可衡量的影响。而 -ffast-math 将我的测试代码加速了 3 倍。
【问题讨论】:
-
如果使用
-ffast-math,则定义__FAST_MATH__。这可能就是它的全部内容,并且没有进一步的影响。 -
我猜头文件 math.h 在某处包含一些#ifdef __FAST_MATH?另外,我仍然认为编译器内部的某些东西与 -ffast-math 的行为不同。
-
答案stackoverflow.com/questions/7420665/… 有很多关于标志实际作用的信息。
-
@Uli:确实,
#ifdef __FAST_MATH__出现在 math.h、x86_64-linux-gnu/bits/mathinline.h 以及更多位置。它也出现在 Eigen3 或 boost/math 等独立项目中。 -
如果它的细粒度控制你可能能够显式调用特定的库函数。例如,fdlibm 库有许多不同的入口点,用于每个数学函数的特定实现。它具有 SVID、X/OPEN 或 POSIX/ANSI 版本的不同功能。不过,您可能会失去便携性。
标签: math gcc optimization c-preprocessor