0
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 ......并且它还在增长。感谢所有回复。

4

1 回答 1

0

int fac溢出。将其更改为long double,并且效果更好。

一个 32 位有符号整数最多只能保存 12! 的值,而 80 或 128 位长的 double 可以保存类似 2000! 的值。

于 2016-11-18T12:30:11.330 回答