我有一个应用程序,在用 double 进行数学计算时,由于灾难性的截断错误,我绝对必须使用 long double
数据类型。我的测试程序变得很疯狂,因为在 windows 上,long double 与 Visual Studio 只是 double 的别名,而在 linux 和 OSX 上,long double 是一个真正的 long double,标称精度为 1e-19。
关于 mingw(GCC 的 Windows 端口)是我感到困惑的地方。 Mingw 声称 LDBL_EPSILON 的精度为 1e-19,但 googleing 表明 mingw 使用的 c 运行时实际上只是不支持真正的 long double 的 microsoft c 运行时。任何人都可以在这里阐明什么吗?
编辑:问题的症结在于:在 mingw 上,如果我调用数学函数 log(long double x)
,这是否只是 日志(双 x)
?无论哪种情况,我如何编写自己的脚本来测试此行为和/或对其进行测试?
最佳答案
代码如下
#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 选项)并发现调用了内部但不同于 double 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 在算术和 math.functions 中支持 long double 格式,并且这种支持是内置的,而不是基于 libquadmath
关于c++ - 在 Windows 上使用长 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27208304/