Здравствуйте, __kot3, Вы писали:
__>Здравствуйте, мыщъх, Вы писали:
М>>а что вы думаете?
__>А что тут думать? Вот пример:
__>__>T s = 0;
__>for (T k = 1; /* бесконечный цикл как в матане */; ++k)
__>{
__> s += k / pow(2, k);
__>}
__>std::cout << s << std::endl;
__>
__>здесь T — это некоторый тип для точного представления рациональных чисел. Нетрудно видеть, что s будет в точности равняться 2 (если определить бесконечную сумму так, как это делается в математическом анализе). Более того, чтобы это увидеть, достаточно конечного времени (зависит от человека / системы символьной математики) и ресурсов (листочек бумаги / несколько сотен мегабайт RAM и пара миллионов тактов CPU). Пример здесь: wolfram alpha
Ну, как я это понимаю, мы переписываем этот цикл на два:
T s = 0;
for(T k1 = 1; k1<K0; ++k1)
{
s += k1 / pow(2, k1);
}
for(T k2 = K0; ; ++k2)
{
s += 0; // т.к. k2/pow(2, k1) < epsilon для любого k2>=K0.
}
std::cout << s << std::endl;
А после этого уже компилятор оптимизирует "прочь" цикл №2 как не имеющий побочных эффектов.