我从GNU GCC compiler Manual获得了这些GCC标志。但是,当我尝试使用这些标志(-mpc32
,-mpc64
和-mpc80
)时,无法观察到该行为。因此,我需要有关如何在示例代码中使用这些标志的帮助。
我尝试过的示例代码:test.cpp
#include<stdio.h>
#include<iomanip>
#include<math.h>
int main()
{
double weight = 1.0f;
double roiSize = 137.142364501953125f;
double thresholdValue = 5400.0f;
double alpha = weight / (roiSize * thresholdValue * thresholdValue);
std::cout<<std::setprecision(100)<<"alpha = "<<f<<std::endl;
double test = pow(roiSize, 10);
std::cout<<std::setprecision(100)<<"alpha = "<<f<<std::endl;
}
编译选项:
g++ -mpc32 test.cpp
g++ -mpc64 test.cpp
g++ -mpc80 test.cpp
测试不同x87精度的最简单方法可能是使用long double
,在x86目标上,它是80位x87类型。 (在Windows上,除非long double = double)。
long double
的另一个优点是,您不必使用-m32
进行编译就可以完全使用x87。 (-m64
的默认值为-mfpmath=sse
;双精度和浮点运算将在XMM寄存器中完成,其类型宽度不扩展为x87内部精度。但是long double
将始终使用x87,因为SSE / SSE2无法做80位)。 TL:DR:在使用gcc -mpc32 foo.c
构建的普通64位系统上,-mpc32
不会对double
变量的数学产生任何影响,因为它甚至没有使用传统的x87 FPU。
BTW,此测试用例还取决于使用默认的-O0
进行编译,否则在编译时会不断传播。 (而且不太可能尊重-mpc32
。)
137.142364501953125f
是一个float
常数,在用作double
的初始化程序之前四舍五入为浮点型。因此,尽管已将起始值存储为float
,但它们都四舍五入到最接近的double
。不过,我认为该划分并不精确,因此您仍然会四舍五入。