-3

function double mylog( double  y);

当 时计算 y 的自然对数y>0。通过对幂级数的项求和来做到这一点,

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.0那么 return 0. (实际的 math.h 函数做得比这更好。)例如, for 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");
  }

任何帮助将不胜感激!

4

1 回答 1

3

有一个fastapprox 库可以回答这个问题,并且在一个 C 头文件中还有更多:

引用它:

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);
}
于 2013-02-24T03:03:34.067 回答