2016-11-18 5 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 (2,3) = 8, а мой результат с 20 итерациями - 8.0007 ... и его рост. Thans для всех ответов.

+0

Если он растет: это очень похоже на накопительную проблему округления: результаты промежуточных вычислений не точно вписываются в их временную переменную. Вы просто используете предел точности машины, и я подозреваю, что ошибки накапливаются с тех пор, как вы в основном добавляете и умножаете (эксперимент: какой результат, когда, например, 'x = 0.5' в качестве входных данных, где' tailor_log' дает отрицательные результаты?) , Если это так, вам нужно найти несколько разумных способов (переформулировок), чтобы избежать ошибок округления. – Evert

ответ

0

int fac переполнен. Изменил его на long double, и он работает намного лучше.

32-битный подписанный int будет содержать только значения до 12 !, в то время как двойной или 80-битный двойной бит может содержать что-то вроде 2000 !.

+0

128-битное плавающее число очень редко! и long double - это поведение компилятора. – Stargateur

+0

@Stargateur Да, это правда, но 64 бит должны быть более чем достаточно, чтобы получить приемлемое значение для 2^3 и еще 80 бит. –