mypow() 通过连分数和泰勒级数返回比 pow() 更大的数字

问题描述 投票:0回答:1
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...并且它还在增长。感谢大家的回复。

c pow taylor-series
1个回答
0
投票

int fac
已经溢出来了。改成
long double
,效果好多了。

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

© www.soinside.com 2019 - 2024. All rights reserved.