没有数学库写日志功能?

时间:2013-02-24 02:35:55

标签: c

写下

function double mylog( double  y);

y>0时计算y的自然对数。通过总结幂级数的术语

来做到这一点
mylog( y ) = 2*( x + x^3/3 + x^5/5 + x^7/7 + x^9 /9 + … ) 

将条款总和至x^151。请注意,参数y不是幂级数的x。在计算幂级数之前,计算x:

x = (y‐1)/(y+1)

将函数编写为无副作用(没有I / O,没有输出,没有全局变量)。如果y<=0.0return 0。 (实际的math.h函数比这更好。)例如,对于mylog( 3 )x = 2/5 = .4 mylog( 3 ) = 2*( 0.4 + 0.4^3/3 + 0.4^5/5 + 0.4^7/7 + 0.4^9/9 + … ) ≈ .8473 你的循环可以保留一个变量xpow来构建x的增加的幂,所以你不需要一个嵌套循环。

#include <stdio.h>
#include <stdlib.h>

double  mylog(double y)
{
double x = (y-1)/(y+3);
double sum = 1.0;
double xpow=x;

for(int n = 1; n <= 151; n++)
{

if(n%2!=0)
{

sum = sum + xpow/(double)n;
}
xpow = xpow * x;

 }    

 sum *= 2;

 return sum;
 }

 int main()
 {
double num;

printf("Enter Number ");
scanf("%lf", &num);

num = mylog(num);
printf("%lf \n", num);
system("pause");
  }

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:3)

fastapprox library回答了这个问题以及one C header file中的更多问题:

引用它:

static inline float 
fastlog2 (float x)
{
    union { float f; uint32_t i; } vx = { x };
    union { uint32_t i; float f; } mx = { (vx.i & 0x007FFFFF) | 0x3f000000 };
    float y = vx.i;
    y *= 1.1920928955078125e-7f;

    return y - 124.22551499f
             - 1.498030302f * mx.f 
             - 1.72587999f / (0.3520887068f + mx.f);
}

static inline float
fastlog (float x)
{
    return 0.69314718f * fastlog2 (x);
}