我需要禁用64位系统的FMA3指令(为了向后兼容问题)。我在我的windows环境中使用了_set_FMA3_enable(0)。我需要使用什么选项(或宏)来禁用gcc中的FMA3?
例如。
#include <iostream>
#include <iomanip>
#include <math.h>
#include <limits>
union value
{
double real;
long long unsigned integer;
};
int main()
{
#if defined (_WIN64)
_set_FMA3_enable(0);
#endif
value x;
x.integer = 4602754097807755994;
value y;
y.real = sin(x.real);
std::cout << std::setprecision(17) << y.real << std::endl;
std::cout << y.integer << std::endl;
}在Visual C++上,它通过_set_FMA3_enable(0)运行到0.48674319998526994 4602440005894221058。不使用它的0.48674319998526999 4602440005894221059 (或使用`_set_FMA3_enable(1))。‘
我在使用g++ -g0 -march=x86-64 -O2 -mtune=generic -msse3 -mno-fma -DNDEBUG main.cpp的gcc环境中运行这段代码,总是得到0.48674319998526999 4602440005894221059。
我怎么和gcc一起重现_set_FMA3_enable(0)的结果呢?
Visual Studio 16.7.4.gcc 9.3.0版(带无线用户线)
发布于 2020-10-05 20:48:33
《gcc》中的
如何禁用fma3指令
可以使用-mno-fma选项禁用FMA3指令的生成。-ffp-contract=off是另一个选项,它也应该禁用对FMA的单独乘法和加法操作的收缩。
如何使用gcc重现visual studio的效果?
显然,不是通过禁用FMA指令。FMA并不是唯一影响浮点运算精度的因素。
您可以尝试不依赖sin的标准库,而是在两个系统上使用相同的实现。您还可以显式设置舍入模式,以便不依赖于系统默认值。如果你这样做了,那么你也应该使用-frounding-math。
如果你可以不依赖于获得完全相同的结果,那将会更简单。
附注:由于读取形式不活动的联合成员,所示程序的行为在C++中未定义。
https://stackoverflow.com/questions/64207507
复制相似问题