如何使用gnu gcc标志-mpc32,-mpc64和-mpc80?

问题描述 投票:-2回答:1

我从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
c++ x86 gnu floating-point-conversion x87
1个回答
0
投票

测试不同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。不过,我认为该划分并不精确,因此您仍然会四舍五入。

© www.soinside.com 2019 - 2024. All rights reserved.