⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mathinline.h

📁 glibc 库, 不仅可以学习使用库函数,还可以学习函数的具体实现,是提高功力的好资料
💻 H
📖 第 1 页 / 共 2 页
字号:
  __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 + -