Тут лучше переключатель сделать:
#include <cmath>
#include <iostream>
int main()
{
int i, n;
std::cout.precision(17);
double S = M_E - 1., s, p, x;
while (true)
{
std::cout << "x n: ";
std::cin >> x >> n;
s = n * sqrt(fabs(x));
if (n > 18) s += S;
else
{
p = 1.;
for (i = 1; i <= n; ++i)
s += 1. / (p *= i);
}
std::cout << s << std::endl;
}
}
Потому что ограниченный ряд
⅀(k=1;n)1/k! довольно быстро
сходится к числу е-1 и если значение
вычисляемого выражения s
предполагается типа double, то
при n>18 вычислять его циклом
бессмысленно, а если s взять типа
float, то даже и предельные 18
слагаемых ряда - непозволительная
роскошь! Представьте себе, что n -
тысяча, миллион или миллиард. Что - так и будете циклом считать?