我有一个应用程序,我绝对必须使用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)吗?在任何一种情况下,我如何编写自己的脚本来测试此行为和/或测试它?
以下代码
#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;
}
Run Code Online (Sandbox Code Playgroud)
产生输出 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); }
Run Code Online (Sandbox Code Playgroud)
log()、sin() 也一样,你能想到的都可以
因此,我相信 MinGW 支持算术和 math.functions 中的长双精度格式,并且这种支持是内置的,而不是基于 libquadmath
| 归档时间: |
|
| 查看次数: |
726 次 |
| 最近记录: |