我正在使用 gdb 进行调试,发现四倍精度数字显示不正确。我正在测试的代码是:
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
extern "C" {
#include "quadmath.h"
}
int main ()
{
char buf[128];
int n;
double x = 4.0;
double y = x + 1e-5;
double z = 0.0;
z = (exp(x) - exp(y))/(x-y);
printf("In double precision : %.32e\n", z);
double zz = exp(x/2)*exp(y/2)*2*sinh((x-y)/2)/(x-y);
printf("In double precision using sinh: %.32e\n", zz);
__float128 qx = x;
__float128 qy = y;
__float128 qz = 0.0q;
qz = (expq(qx) - expq(qy))/(qx-qy);
n = quadmath_snprintf(buf, sizeof buf, "%.32Qe", qz);
if ((size_t) n < sizeof buf)
printf ("In quadruple precision : %s\n", buf);
return 0;
}
(注意 extern 以解决 libquadmath 错误。)
我编译: g++ aC -g -lquadmath
然后我得到:
Breakpoint 1, main () at a.C:19
19 printf("In double precision using sinh: %.32e\n", zz);
(gdb) n
In double precision using sinh: 5.45984230248043687083736585918814e+01
21 __float128 qx = x;
(gdb)
22 __float128 qy = y;
(gdb) p qx
$1 = 0
这似乎是一个 gdb 错误,因为最终结果似乎还可以。我的问题只是这是否应该工作?gdb 是否支持四边形?在这些情况下,我是否需要做一些特别的事情才能让 gdb 工作?
该程序的重点是演示灾难性取消,并且使用 sinh 提供所需的(双精度)精度,而无需四元算术:
In double precision : 5.45984230249338509111112216487527e+01
In double precision using sinh: 5.45984230248043687083736585918814e+01
In quadruple precision : 5.45984230248043659065767385111870e+01
谢谢!
PS:无法使用四倍精度进行标记,我没有足够的声誉来创建新标签。