double taylor_log(double x, unsigned int n){
double tmp;
double sum = 0;
if(x < 1){
int j = 2;
x = 1 - x;
tmp = x;
sum = -x;
for(unsigned int i = 1; i < n; i++){
sum -= ((tmp *= x) / j);
j++;
}
return sum;
}
else if (x >= 1){
tmp = ((x-1)/x);
for(unsigned int i = 1; i <= n; i++){
sum += (tmp/i);
tmp *= ((x-1)/x);
}
return sum;
这是我的泰勒级数对数函数,可以正常工作。 我正在使用这个公式来获取数字的指数函数。mypow() 的公式
这是我的 pow 代码
double taylor_pow(double x, double y, unsigned int n){
double sum = 1.0;
int fac = 1;
double exp = y;
double lna = taylor_log( x, n);
for(unsigned int i = 1; i <= n; i++){
fac *= i;
sum += (exp * lna / fac );
exp *= y;
lna *= taylor_log( x, n);
}
return sum;
}
现在我的问题是,如果我为我的函数进行 30 次迭代,那么这个数字会高于 pow()。例如 pow(2,3) = 8,我的 20 次迭代结果是 8.0007...并且它还在增长。感谢大家的回复。
int fac
已经溢出来了。改成long double
,效果好多了。
32 位有符号 int 只能保存最多 12! 的值,而 80 或 128 位长的 double 可以保存类似 2000! 的值。