写下
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.0
则return 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");
}
非常感谢任何帮助!
答案 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);
}