C 库函数源码

sin ( )函数
double my_sin(double x)
{
   register double ret;
   __asm__ (
      "fsin"
      : "=t" (ret)
      : "0" (x)
   );
   return ret;
}
cos ( )函数
double my_cos (double x)
{
   register double ret;
   __asm__(
      "fcos"
      : "=t" (ret)
      : "0" (x)
   );
   return ret;
}
exp ( )函数
 
double my_exp(double x)
{
   register double ret, value;
   __asm__(
      "fldl2e;"   
      "fmul %%st(1);"
      "fst %%st(1);/n/t"
      "frndint;"        
      "fxch;/n/t"
      "fsub %%st(1);" 
      "f2xm1"
      : "=t" (ret), "=u" (value)
      : "0" (x)
   );
  
   ret += 1.0;
 
   __asm__(
      "fscale"
      : "=t" (ret)
      : "0" (ret), "u" (value)
   );
 
   return ret;
}
pow ( )函数
double my_pow(double x, double y)
{
   register double ret, value;
   double r = 1.0;
   long p = (long) y;
 
   if (x == 0.0 && y > 0.0)
      return 0.0;
   if (y == (double) p)
   {
     
      if (p == 0)
        return 1.0;
      if (p < 0)
      {
        p = -p;
        x = 1.0 / x;
      }
      while (1)
      {
        if (p & 1)
           r *= x;
        p >>= 1;
        if (p == 0)
           return r;
        x *= x;
      }
   }
   __asm__(
      "fmul %%st(1);"
      "fst   %%st(1);"
      "frndint;/n/t"
      "fxch;/n/t"
      "fsub %%st(1);/n/t"
      "f2xm1;/n/t"
      : "=t" (ret), "=u" (value)
      : "0" (log2 (x)), "1" (y)
   );
   ret += 1.0;
   __asm__(
      "fscale"
      : "=t" (ret)
      : "0" (ret), "u" (value)
   );
   return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值