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 倍精度でタグ付けできませんでした。新しいタグを作成するのに十分な評判がありません。