3

我正在使用 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:无法使用四倍精度进行标记,我没有足够的声誉来创建新标签。

4

0 回答 0