C/C++

Почему обнуляется переменная?

Код считает экспоненту через ряд Тейлора. Вначале инициализирую i = 1, он считает до тех пор, пока следующая величина не станет отличаться от предыдущей на какое-то число.
Добавил несколько принтов для отслеживания.
Вначале i = 1, но уже в цикле он зануляется и по проходу каждого цикла вообще не меняется
Можно проверить введя значение 3 в окно

https://codeshare.io/JbPPpK
Зачем на каждом шаге делать медленное возведение в степень и ещё более медленное вычисление факториала, когда члены суммируемого ряда вычисляются простейшей рекуррентной формулой:
t[0] = 1
t[i] = t[i - 1] * x / i;

double x; // не целое и может быть меньше 0
long i = 0;
double TOL = 0.000000001;
scanf("%lf",&x);
double sum_x = 1.0, t = 1.0;
while (fabs(t) >= TOL) {
i += 1;
t = t * x / i;
sum_x += t;
}
printf("Sum is %fl\n", sum_x);
Slava Mal
Slava Mal
56 138
Лучший ответ
если число переваливает за 65535, то это понятно, а так вроде не видно стороннего изменения i
Валерий Кисляк
Валерий Кисляк
58 943
(◔‿◔) А зачем вообще так считать сумму
для экспоненты Σ(n=0;N)xⁿ/n!, если есть рекуррентный метод SPQ (sum, product, qualifier), по иному ещё называющийся CCPS-teqniques (condition, counter, sum, product)? С ним же всё намного проще!. (•‿•)
Смотрим:
exp(x) = 1 + x/1 + x·x/(1·2) + x·x·x/(1·2·3) +..
Инициируем сумму s и произведение p начальным значением 1. Потом в цикле со счётчиком с (counter, его можно также обозначить как k, j или i - это дело хозяйское !) умножаем p на х и делим на с, пока не выполнится condition (условие p<ε, в данном случае ε=TOL=1е-9). А так как экспонента при увеличении х экспонентно быстро возрастает, то условием лучше поставить p/s < TOL - так быстрее вычислится! Для отрицательных х лучше сделать рекурсию if (x<0) 1/Exp(-x), иначе при суммирования знакопеременного ряда может получиться (а это значит, что при некоторых отрицательных значениях х обязательно получится (✿^‿^) !) какая-нибудь белиберда (особенно при больших |х|), а вовсе даже не правильный результат! Вот вся функция:
double Exp(double x) { if (x < 0) return 1 / Exp(-x);
double s = 1, p = 1, c = 0; while (p / s > 1e-9) { c++;
p *= x / c; s += p; } return s; }
。◕‿◕。