我有一个应用程序,我绝对必须使用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)
的别名吗?在任何一种情况下,我如何编写自己的脚本来测试此行为和/或测试它?
答案 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上打印长双打存在问题。 您可能必须使用强制转换或滚动自己的输出例程