2016-11-18 52 views
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; 

這是我與泰勒系列工作正常的功能。我用這個公式來獲得數字的指數函數。 formula for mypow() ,這是我的戰俘mypow()槽連續分數和taylorseries返回更大的數量比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 ......並且它正在增長。 Thans爲所有迴應。

+0

如果增長:這聽起來很像一個積累的舍入問題:中間計算的結果並不完全適合他們的臨時變量。你只是遇到了機器的精度限制,而且我懷疑這些錯誤會累積,因爲你主要是增加和相乘(實驗:例如'x = 0.5'作爲輸入時的結果是什麼,其中'tailor_log'給你否定的結果?) 。如果是這樣的話,你需要找到一些聰明的方法(重新配置)來避免這些舍入錯誤。 – Evert

回答

0

int fac正在滿溢。將其更改爲long double,效果更好。

一個32位有符號整數將只能保持值高達12!,而一個80或128位長雙可以容納像2000年!

+0

128位浮點數非常少見!並且long double是編譯器行爲。 – Stargateur

+0

@ Stargateur是的,的確如此,但是64位應該足以獲得2^3的可接受值,而80位甚至更多。 –