3

gdb でデバッグしていますが、4 倍精度の数値が正しく表示されていません。私がテストしているコードは次のとおりです。

#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;
}

(libquadmath のバグを回避するための extern に注意してください。)

私は次のようにコンパイルします: 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 を使用すると、4 乗演算を使用せずに必要な (倍精度) 精度が得られることを示しています。

In double precision           : 5.45984230249338509111112216487527e+01
In double precision using sinh: 5.45984230248043687083736585918814e+01
In quadruple precision        : 5.45984230248043659065767385111870e+01

ありがとう!

PS: 4 倍精度でタグ付けできませんでした。新しいタグを作成するのに十分な評判がありません。

4

0 に答える 0