📄 mathinline.h
字号:
__asm __volatile__ \ ("fscale # 2^int(x * log2(e))\n\t" \ : "=t" (__temp) : "0" (1.0), "u" (__exponent)); \ __temp -= 1.0; \ __temp += __value; \ return __temp ? __temp : __x# endif__inline_mathcodeNP_ (long double, __expm1l, __x, __expm1_code)# if __GNUC_PREREQ (3, 4)__inline_mathcodeNP_ (long double, __expl, __x, return __builtin_expl (__x))# else# define __exp_code \ register long double __value; \ register long double __exponent; \ __asm __volatile__ \ ("fldl2e # e^x = 2^(x * log2(e))\n\t" \ "fmul %%st(1) # x * log2(e)\n\t" \ "fst %%st(1)\n\t" \ "frndint # int(x * log2(e))\n\t" \ "fxch\n\t" \ "fsub %%st(1) # fract(x * log2(e))\n\t" \ "f2xm1 # 2^(fract(x * log2(e))) - 1\n\t" \ : "=t" (__value), "=u" (__exponent) : "0" (__x)); \ __value += 1.0; \ __asm __volatile__ \ ("fscale" \ : "=t" (__value) : "0" (__value), "u" (__exponent)); \ return __value__inline_mathcodeNP (exp, __x, __exp_code)__inline_mathcodeNP_ (long double, __expl, __x, __exp_code)# endif# if !__GNUC_PREREQ (3, 5)__inline_mathcodeNP (tan, __x, \ register long double __value; \ register long double __value2 __attribute__ ((__unused__)); \ __asm __volatile__ \ ("fptan" \ : "=t" (__value2), "=u" (__value) : "0" (__x)); \ return __value)# endif#endif /* __FAST_MATH__ */#if __GNUC_PREREQ (3, 4)__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, return __builtin_atan2l (__y, __x))#else# define __atan2_code \ register long double __value; \ __asm __volatile__ \ ("fpatan" \ : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); \ return __value# ifdef __FAST_MATH____inline_mathcodeNP2 (atan2, __y, __x, __atan2_code)# endif__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, __atan2_code)#endif#if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)__inline_mathcodeNP2 (fmod, __x, __y, \ register long double __value; \ __asm __volatile__ \ ("1: fprem\n\t" \ "fnstsw %%ax\n\t" \ "sahf\n\t" \ "jp 1b" \ : "=t" (__value) : "0" (__x), "u" (__y) : "ax", "cc"); \ return __value)#endif#ifdef __FAST_MATH__# if !__GNUC_PREREQ (3,3)__inline_mathopNP (sqrt, "fsqrt")__inline_mathopNP_ (long double, __sqrtl, "fsqrt")# define __libc_sqrtl(n) __sqrtl (n)# else# define __libc_sqrtl(n) __builtin_sqrtl (n)# endif#endif#if __GNUC_PREREQ (2, 8)__inline_mathcodeNP_ (double, fabs, __x, return __builtin_fabs (__x))# if defined __USE_MISC || defined __USE_ISOC99__inline_mathcodeNP_ (float, fabsf, __x, return __builtin_fabsf (__x))__inline_mathcodeNP_ (long double, fabsl, __x, return __builtin_fabsl (__x))# endif__inline_mathcodeNP_ (long double, __fabsl, __x, return __builtin_fabsl (__x))#else__inline_mathop (fabs, "fabs")__inline_mathop_ (long double, __fabsl, "fabs")#endif#ifdef __FAST_MATH__# if !__GNUC_PREREQ (3, 4)/* The argument range of this inline version is reduced. */__inline_mathopNP (sin, "fsin")/* The argument range of this inline version is reduced. */__inline_mathopNP (cos, "fcos")__inline_mathop_declNP (log, "fldln2; fxch; fyl2x", "0" (__x) : "st(1)")# endif# if !__GNUC_PREREQ (3, 5)__inline_mathop_declNP (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")__inline_mathcodeNP (asin, __x, return __atan2l (__x, __libc_sqrtl (1.0 - __x * __x)))__inline_mathcodeNP (acos, __x, return __atan2l (__libc_sqrtl (1.0 - __x * __x), __x))# endif# if !__GNUC_PREREQ (3, 4)__inline_mathop_declNP (atan, "fld1; fpatan", "0" (__x) : "st(1)")# endif#endif /* __FAST_MATH__ */__inline_mathcode_ (long double, __sgn1l, __x, \ __extension__ union { long double __xld; unsigned int __xi[3]; } __n = \ { __xld: __x }; \ __n.__xi[2] = (__n.__xi[2] & 0x8000) | 0x3fff; \ __n.__xi[1] = 0x80000000; \ __n.__xi[0] = 0; \ return __n.__xld)#ifdef __FAST_MATH__/* The argument range of the inline version of sinhl is slightly reduced. */__inline_mathcodeNP (sinh, __x, \ register long double __exm1 = __expm1l (__fabsl (__x)); \ return 0.5 * (__exm1 / (__exm1 + 1.0) + __exm1) * __sgn1l (__x))__inline_mathcodeNP (cosh, __x, \ register long double __ex = __expl (__x); \ return 0.5 * (__ex + 1.0 / __ex))__inline_mathcodeNP (tanh, __x, \ register long double __exm1 = __expm1l (-__fabsl (__x + __x)); \ return __exm1 / (__exm1 + 2.0) * __sgn1l (-__x))#endif__inline_mathcodeNP (floor, __x, \ register long double __value; \ register int __ignore; \ unsigned short int __cw; \ unsigned short int __cwtmp; \ __asm __volatile ("fnstcw %3\n\t" \ "movzwl %3, %1\n\t" \ "andl $0xf3ff, %1\n\t" \ "orl $0x0400, %1\n\t" /* rounding down */ \ "movw %w1, %2\n\t" \ "fldcw %2\n\t" \ "frndint\n\t" \ "fldcw %3" \ : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp), \ "=m" (__cw) \ : "0" (__x)); \ return __value)__inline_mathcodeNP (ceil, __x, \ register long double __value; \ register int __ignore; \ unsigned short int __cw; \ unsigned short int __cwtmp; \ __asm __volatile ("fnstcw %3\n\t" \ "movzwl %3, %1\n\t" \ "andl $0xf3ff, %1\n\t" \ "orl $0x0800, %1\n\t" /* rounding up */ \ "movw %w1, %2\n\t" \ "fldcw %2\n\t" \ "frndint\n\t" \ "fldcw %3" \ : "=t" (__value), "=&q" (__ignore), "=m" (__cwtmp), \ "=m" (__cw) \ : "0" (__x)); \ return __value)#ifdef __FAST_MATH__# define __ldexp_code \ register long double __value; \ __asm __volatile__ \ ("fscale" \ : "=t" (__value) : "0" (__x), "u" ((long double) __y)); \ return __value__MATH_INLINE double__NTH (ldexp (double __x, int __y)){ __ldexp_code;}#endif/* Optimized versions for some non-standardized functions. */#if defined __USE_ISOC99 || defined __USE_MISC# ifdef __FAST_MATH____inline_mathcodeNP (expm1, __x, __expm1_code)/* We cannot rely on M_SQRT being defined. So we do it for ourself here. */# define __M_SQRT2 1.41421356237309504880L /* sqrt(2) */# if !__GNUC_PREREQ (3, 5)__inline_mathcodeNP (log1p, __x, \ register long double __value; \ if (__fabsl (__x) >= 1.0 - 0.5 * __M_SQRT2) \ __value = logl (1.0 + __x); \ else \ __asm __volatile__ \ ("fldln2\n\t" \ "fxch\n\t" \ "fyl2xp1" \ : "=t" (__value) : "0" (__x) : "st(1)"); \ return __value)# endif/* The argument range of the inline version of asinhl is slightly reduced. */__inline_mathcodeNP (asinh, __x, \ register long double __y = __fabsl (__x); \ return (log1pl (__y * __y / (__libc_sqrtl (__y * __y + 1.0) + 1.0) + __y) \ * __sgn1l (__x)))__inline_mathcodeNP (acosh, __x, \ return logl (__x + __libc_sqrtl (__x - 1.0) * __libc_sqrtl (__x + 1.0)))__inline_mathcodeNP (atanh, __x, \ register long double __y = __fabsl (__x); \ return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))/* The argument range of the inline version of hypotl is slightly reduced. */__inline_mathcodeNP2 (hypot, __x, __y, return __libc_sqrtl (__x * __x + __y * __y))# if !__GNUC_PREREQ (3, 5)__inline_mathcodeNP(logb, __x, \ register long double __value; \ register long double __junk; \ __asm __volatile__ \ ("fxtract\n\t" \ : "=t" (__junk), "=u" (__value) : "0" (__x)); \ return __value)# endif# endif#endif#ifdef __USE_ISOC99# ifdef __FAST_MATH__# if !__GNUC_PREREQ (3, 5)__inline_mathop_declNP (log2, "fld1; fxch; fyl2x", "0" (__x) : "st(1)")# endif__MATH_INLINE float__NTH (ldexpf (float __x, int __y)){ __ldexp_code;}__MATH_INLINE long double__NTH (ldexpl (long double __x, int __y)){ __ldexp_code;}__inline_mathcodeNP3 (fma, __x, __y, __z, return (__x * __y) + __z)__inline_mathopNP (rint, "frndint")# endif /* __FAST_MATH__ */# define __lrint_code \ long int __lrintres; \ __asm__ __volatile__ \ ("fistpl %0" \ : "=m" (__lrintres) : "t" (__x) : "st"); \ return __lrintres__MATH_INLINE long int__NTH (lrintf (float __x)){ __lrint_code;}__MATH_INLINE long int__NTH (lrint (double __x)){ __lrint_code;}__MATH_INLINE long int__NTH (lrintl (long double __x)){ __lrint_code;}# undef __lrint_code# define __llrint_code \ long long int __llrintres; \ __asm__ __volatile__ \ ("fistpll %0" \ : "=m" (__llrintres) : "t" (__x) : "st"); \ return __llrintres__MATH_INLINE long long int__NTH (llrintf (float __x)){ __llrint_code;}__MATH_INLINE long long int__NTH (llrint (double __x)){ __llrint_code;}__MATH_INLINE long long int__NTH (llrintl (long double __x)){ __llrint_code;}# undef __llrint_code#endif#ifdef __USE_MISC# if defined __FAST_MATH__ && !__GNUC_PREREQ (3, 5)__inline_mathcodeNP2 (drem, __x, __y, \ register double __value; \ register int __clobbered; \ __asm __volatile__ \ ("1: fprem1\n\t" \ "fstsw %%ax\n\t" \ "sahf\n\t" \ "jp 1b" \ : "=t" (__value), "=&a" (__clobbered) : "0" (__x), "u" (__y) : "cc"); \ return __value)# endif/* This function is used in the `isfinite' macro. */__MATH_INLINE int__NTH (__finite (double __x)){ return (__extension__ (((((union { double __d; int __i[2]; }) {__d: __x}).__i[1] | 0x800fffffu) + 1) >> 31));}/* Miscellaneous functions */# ifdef __FAST_MATH____inline_mathcode (__coshm1, __x, \ register long double __exm1 = __expm1l (__fabsl (__x)); \ return 0.5 * (__exm1 / (__exm1 + 1.0)) * __exm1)__inline_mathcode (__acosh1p, __x, \ return log1pl (__x + __libc_sqrtl (__x) * __libc_sqrtl (__x + 2.0)))# endif /* __FAST_MATH__ */#endif /* __USE_MISC *//* Undefine some of the large macros which are not used anymore. */#undef __atan2_code#ifdef __FAST_MATH__# undef __expm1_code# undef __exp_code# undef __sincos_code#endif /* __FAST_MATH__ */#endif /* __NO_MATH_INLINES *//* This code is used internally in the GNU libc. */#ifdef __LIBC_INTERNAL_MATH_INLINES__inline_mathop (__ieee754_sqrt, "fsqrt")__inline_mathcode2 (__ieee754_atan2, __y, __x, register long double __value; __asm __volatile__ ("fpatan\n\t" : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); return __value;)#endif#endif /* __GNUC__ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -