先说以下问题的起源:我在学习lua的过程中发现sin(pi)和sin(3pi)的计算结果不一样,于是心中有了疑惑,然后我有用了C语言了作了同样的计算,一开始我用的是printf("%lf",result)来输出结果的,没有发现区别,之后使用printf(“%e",result)出处结果发现原来C语言中的结果也是不一样的,于是我就想看看c语言中sin(x)是如何实现的为什么这样明显的周期函数没有安装周期函数来处理,这一看不要紧,自己立马震惊了,原来我一直以为自己的C语言功底还是可以的,倒是看了glibc的源代码之后才发现自己的真的很欠修炼。
一开始我认为sin(x)应该有一个对应的函数,于是使用grep ”double sin(“ * -r 在glibc目录下查找结果找到的内容中没有一个是真的sin(x)函数的定义的。最后使用grep sin * -r 找到了一个sin的定义,#define sin(Val) __TGMATH_UNARY_REAL_IMAG (Val, sin, csin),居然是宏定义,让我十分的吃惊,但是更加让我吃惊的事情是我居然看不懂_TGMATH_UNARY_REAL_IMAG 的展开结果是什么。
所以在此等待高人解答。
# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
(__extension__ ((sizeof (__real__ (Val)) == sizeof (double) \
|| __builtin_classify_type (__real__ (Val)) != 8) \
? ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) Fct (Val) \
: (__tgmath_real_type (Val)) Cfct (Val)) \
: (sizeof (__real__ (Val)) == sizeof (float)) \
? ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) Fct##f (Val) \
: (__tgmath_real_type (Val)) Cfct##f (Val)) \
: ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) __tgml(Fct) (Val) \
: (__tgmath_real_type (Val)) __tgml(Cfct) (Val))))
gccmacroc
一开始我认为sin(x)应该有一个对应的函数,于是使用grep ”double sin(“ * -r 在glibc目录下查找结果找到的内容中没有一个是真的sin(x)函数的定义的。最后使用grep sin * -r 找到了一个sin的定义,#define sin(Val) __TGMATH_UNARY_REAL_IMAG (Val, sin, csin),居然是宏定义,让我十分的吃惊,但是更加让我吃惊的事情是我居然看不懂_TGMATH_UNARY_REAL_IMAG 的展开结果是什么。
所以在此等待高人解答。
# define __TGMATH_UNARY_REAL_IMAG(Val, Fct, Cfct) \
(__extension__ ((sizeof (__real__ (Val)) == sizeof (double) \
|| __builtin_classify_type (__real__ (Val)) != 8) \
? ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) Fct (Val) \
: (__tgmath_real_type (Val)) Cfct (Val)) \
: (sizeof (__real__ (Val)) == sizeof (float)) \
? ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) Fct##f (Val) \
: (__tgmath_real_type (Val)) Cfct##f (Val)) \
: ((sizeof (__real__ (Val)) == sizeof (Val)) \
? (__tgmath_real_type (Val)) __tgml(Fct) (Val) \
: (__tgmath_real_type (Val)) __tgml(Cfct) (Val))))
gccmacroc
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货