gpt4 book ai didi

c - 不用数学库就可以写日志函数吗?

转载 作者:行者123 更新时间:2023-11-30 20:07:15 25 4
gpt4 key购买 nike

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");
}

任何帮助将不胜感激!

最佳答案

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);
}

关于c - 不用数学库就可以写日志函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15048098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com