在窗户上使用长双打

时间:2014-11-29 23:28:22

标签: c++ windows mingw

我有一个应用程序,我绝对必须使用long double数据类型,因为在使用双精度进行数学运算时会出现灾难性截断错误。我的测试程序很疯狂,因为在Windows上,使用Visual Studio的双倍只是一个双倍的别名,而在Linux和OSX上,long double是一个真正的长双精度,标称精度为1e-19。

在mingw(GCC的Windows端口)是我感到困惑的地方。 Mingw声称LDBL_EPSILON的精度为1e-19,但googleing表明mingw使用的c运行时实际上只是微软c运行时,它不支持真正的长双精度。任何人都可以在这里发光吗?

编辑:问题的症结在于:在mingw上,如果我调用数学函数log(long double x),这只是log(double x)的别名吗?在任何一种情况下,我如何编写自己的脚本来测试此行为和/或测试它?

2 个答案:

答案 0 :(得分:3)

以下代码

#include <iostream>
#include <cmath>

int main(void)
{
    long double y = 2.0L;

    std::cout << sizeof(y) << std::endl;

    long double q = sqrt(y);

    std::cout << q << std::endl;

    return 0;
}

产生了输出16 1.41421,到目前为止一直很好

让它抛出预处理器(-E选项)并发现内部,但不同于双sqrt()函数被调用

using ::sqrt;

inline constexpr float sqrt(float __x)
{ return __builtin_sqrtf(__x); }

inline constexpr long double sqrt(long double __x)
{ return __builtin_sqrtl(__x); }

同样适用于log(),sin(),您可以将其命名为

因此,我相信MinGW支持算术和数学函数中的长双格式,这种支持是内置的,而不是基于libquadmath的

答案 1 :(得分:1)

刚试过MinGW(来自nuwen的MinGW发行版,gcc / g ++ 4.9.1,64bit)

遵循计划

#include <iostream>

int main(void)
{
    double x = 1.0;
    long double y = 2.0L;

    std::cout << sizeof(x) << std::endl;
    std::cout << sizeof(y) << std::endl;
}

产生 8 16

我猜,支持long double并且与标准double不同,因此 您的计算可能会产生所需的结果

我听说由于使用MS旧运行时在Windows上打印长双打存在问题。 您可能必须使用强制转换或滚动自己的输出例程