Помогите побороть бесконечный цикл! - вопрос №582931

Надо написать программу, которая высчитывает значения функцкии exp(-x), разложив функцию в ряд, а у меня получается бесконечный цикл… вот мой код:

#include//Подключаем библиотеку ввода/вывода

int main(){ // Создаем заголовок программы и открывает тело

       int i,n,l;  // Объявляем нужные нам пременные

       float S,S1,K,x,M;

       x=1; S=1; S1=1; n=2; l=-1; M=1; // Задаем начальные значения

       for(i=1; iэкспомненты

             M=M*i; // Факториал

             K=(x/M); // Делаем так, чтона каждом шаге, программа высчитывает слагамаое суммы ряда

             S1=S1+K*l; // Создаем первую сумму ряда

             n++; // Увеличиваем значение n для продолжения цикла

             if(S=S1){ // Проверяем условие двух сумм ряда на наличие машинного нуля

             printf («exp= %f \n  zero= %f\n», S1, S); // Выводим значение экспоненты и машинного нуля

             n=n-2; // Уменьшаем значение n для прекращения цикла

             } // Закрываем тело цикла

             S=S+K*l; // Считаем вторую сумму ряда для определения машинного нуля

             l=l*(-1); // Т.к. Ряд знакочеридующийся меняем знак слогаемого на каждом шаге

       } // Завершение цикла for

 

             return 0; // Возвращаем

       } // Закрываем тело программы

18.03.13
1 ответ

Лучший ответ по мнению автора

судя по всему n использовано только для управления циклом

что бы не ломать голову, я бы предложил несколько иной подход, без n вообще, далее смотрите по тексту программы и комментариям

(внимание! алгоритм вычисления не проверялся и не изменялся! предложено только корректное завершение цикла)

    1. // ConsoleApplication1.cpp: определяет точку входа для консольного приложения.

 //

    1. #include «stdafx.h»
    1. int _tmain(int argc, _TCHAR* argv[]) 
    1.     // на заголовки не обращайте внимания 
    1.     // заговка создана Visual Studio 
    1.     // используйте только тело программы - оно будет полностью совместимо 
    1.     int i,n,l; // Объявляем нужные нам пременные 
    1.     float S,S1,K,x,M; 
    1.     x=1; S=1; S1=1; n=2; l=-1; M=1; // Задаем начальные значения 
    1.     i=1; // задаем начальное значение, в последствии просто инкрементируем его в теле цикла 
    1.     bool stop = false; // для критерия продолжения используем отдельную логическую переменную 
    1.     while(!stop) //экспомненты 
    1.     { 
    1.         M=M*i++; // Факториал 
    1.                  // !!! используем автоинкремент, ++ располженный после переменной, 
    1.                  // увеличивает ее значение после того как старое значение использовано в формуле 
    1.         K=(x/M); // Делаем так, что на каждом шаге, программа высчитывает слагамаое суммы ряда 
    1.         S1=S1+K*l; // Создаем первую сумму ряда 
    1.         if(S=S1) // Проверяем условие двух сумм ряда на наличие машинного нуля 
    1.         { 
    1.             printf («exp= %f \n  zero= %f\n», S1, S); // Выводим значение экспоненты и машинного нуля 
    1.             stop = true; // не ломая голову над индексами, 
    1.                          // просто указываем явным образом что пора заканчивать 
    1.         } // Закрываем тело цикла 
    1.         S=S+K*l; // Считаем вторую сумму ряда для определения машинного нуля 
    1.         l=l*(-1); // Т.к. Ряд знакочеридующийся меняем знак слогаемого на каждом шаге 
    1.     } // Завершение цикла while
    1.     return  0
    1. }
18.03.13
Лучший ответ по мнению автора

Виталий

Читать ответы

Михаил Евгеньевич

Читать ответы
Посмотреть всех экспертов из раздела Технологии > C/C++
Пользуйтесь нашим приложением Доступно на Google Play Загрузите в App Store