先说以下问题的起源:我在学习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