📄 mathinline.h
字号:
__MATH_INLINE void__sincosl (long double __x, long double *__sinx, long double *__cosx) __THROW{ __sincos_code;}# endif/* Optimized inline implementation, sometimes with reduced precision and/or argument range. */# define __expm1_code \ register long double __value; \ register long double __exponent; \ register long double __temp; \ __asm __volatile__ \ ("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\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" \ "fscale # 2^(x * log2(e)) - 2^(int(x * log2(e)))\n\t" \ : "=t" (__value), "=u" (__exponent) : "0" (__x)); \ __asm __volatile__ \ ("fscale # 2^int(x * log2(e))\n\t" \ : "=t" (__temp) : "0" (1.0), "u" (__exponent)); \ __temp -= 1.0; \ return __temp + __value ? __temp + __value : __x__inline_mathcodeNP_ (long double, __expm1l, __x, __expm1_code)# 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)__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 /* __FAST_MATH__ */#define __atan2_code \ register long double __value; \ __asm __volatile__ \ ("fpatan" \ : "=t" (__value) : "0" (__x), "u" (__y) : "st(1)"); \ return __value__inline_mathcodeNP2 (atan2, __y, __x, __atan2_code)__inline_mathcodeNP2_ (long double, __atan2l, __y, __x, __atan2_code)__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)__inline_mathopNP (sqrt, "fsqrt")__inline_mathopNP_ (long double, __sqrtl, "fsqrt")#if __GNUC_PREREQ (2, 8)__inline_mathcodeNP_ (double, fabs, __x, return __builtin_fabs (__x))__inline_mathcodeNP_ (float, fabsf, __x, return __builtin_fabsf (__x))__inline_mathcodeNP_ (long double, fabsl, __x, return __builtin_fabsl (__x))__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__/* 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)")__inline_mathop_declNP (log10, "fldlg2; fxch; fyl2x", "0" (__x) : "st(1)")__inline_mathcodeNP (asin, __x, return __atan2l (__x, __sqrtl (1.0 - __x * __x)))__inline_mathcodeNP (acos, __x, return __atan2l (__sqrtl (1.0 - __x * __x), __x))#endif /* __FAST_MATH__ */__inline_mathop_declNP (atan, "fld1; fpatan", "0" (__x) : "st(1)")__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; \ __volatile unsigned short int __cw; \ __volatile unsigned short int __cwtmp; \ __asm __volatile ("fnstcw %0" : "=m" (__cw)); \ __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */ \ __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); \ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); \ __asm __volatile ("fldcw %0" : : "m" (__cw)); \ return __value)__inline_mathcodeNP (ceil, __x, \ register long double __value; \ __volatile unsigned short int __cw; \ __volatile unsigned short int __cwtmp; \ __asm __volatile ("fnstcw %0" : "=m" (__cw)); \ __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */ \ __asm __volatile ("fldcw %0" : : "m" (__cwtmp)); \ __asm __volatile ("frndint" : "=t" (__value) : "0" (__x)); \ __asm __volatile ("fldcw %0" : : "m" (__cw)); \ return __value)#define __ldexp_code \ register long double __value; \ __asm __volatile__ \ ("fscale" \ : "=t" (__value) : "0" (__x), "u" ((long double) __y)); \ return __value__MATH_INLINE doubleldexp (double __x, int __y) __THROW{ __ldexp_code;}/* Optimized versions for some non-standardized functions. */#if defined __USE_ISOC99 || defined __USE_MISC# ifdef __FAST_MATH____inline_mathcodeNP (expm1, __x, __expm1_code)# endif/* We cannot rely on M_SQRT being defined. So we do it for ourself here. */# define __M_SQRT2 1.41421356237309504880L /* sqrt(2) */__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)/* 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 / (__sqrtl (__y * __y + 1.0) + 1.0) + __y) \ * __sgn1l (__x)))__inline_mathcodeNP (acosh, __x, \ return logl (__x + __sqrtl (__x - 1.0) * __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 __sqrtl (__x * __x + __y * __y))__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#ifdef __USE_ISOC99#ifdef __FAST_MATH____inline_mathop_declNP (log2, "fld1; fxch; fyl2x", "0" (__x) : "st(1)")#endif /* __FAST_MATH__ */__MATH_INLINE floatldexpf (float __x, int __y) __THROW{ __ldexp_code;}__MATH_INLINE long doubleldexpl (long double __x, int __y) __THROW{ __ldexp_code;}#ifdef __FAST_MATH____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 intlrintf (float __x) __THROW{ __lrint_code;}__MATH_INLINE long intlrint (double __x) __THROW{ __lrint_code;}__MATH_INLINE long intlrintl (long double __x) __THROW{ __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 intllrintf (float __x) __THROW{ __llrint_code;}__MATH_INLINE long long intllrint (double __x) __THROW{ __llrint_code;}__MATH_INLINE long long intllrintl (long double __x) __THROW{ __llrint_code;}#undef __llrint_code#endif#ifdef __USE_MISC__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)/* This function is used in the `isfinite' macro. */__MATH_INLINE int__finite (double __x) __THROW{ 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 + __sqrtl (__x) * __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 + -