📄 980414-1.c
字号:
/* Test double on x86. *//* { dg-do run { target i?86-*-* } } *//* { dg-options -O2 } */extern void abort (void);static __inline doublemypow (double __x, double __y){ register double __value, __exponent; long __p = (long) __y; if (__y == (double) __p) { double __r = 1.0; if (__p == 0) return 1.0; if (__p < 0) { __p = -__p; __x = 1.0 / __x; } while (1) { if (__p & 1) __r *= __x; __p >>= 1; if (__p == 0) return __r; __x *= __x; } } __asm __volatile__ ("fmul %%st(1),%%st\n\t" /* y * log2(x) */ "fst %%st(1)\n\t" "frndint\n\t" /* int(y * log2(x)) */ "fxch %%st(1)\n\t" "fsub %%st(1),%%st\n\t" /* fract(y * log2(x)) */ "f2xm1\n\t" /* 2^(fract(y * log2(x))) - 1 */ : "=t" (__value), "=u" (__exponent) : "0" (__x), "1" (__y)); __value += 1.0; __asm __volatile__ ("fscale" : "=t" (__value) : "0" (__value), "u" (__exponent)); return __value;}const double E1 = 2.71828182845904523536028747135;double fact (double x){ double corr; corr = 1.0; return corr * mypow(x/E1, x);}int main (){ double y, z; y = fact (46.2); z = mypow (46.2/E1, 46.2);#if 0 printf ("%26.19e, %26.19e\n", y, z);#endif if (y > z) y -= z; else y = z - y; y /= z; if (y > 0.1) abort (); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -