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