Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.04.2010, 17:39   #1
PPPPPP
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 22
По умолчанию Программа про синус (на Си). Где закралась ошибка!?

Друзья, помогите пожалуйста! Вторую неделю бьюсь!

У меня есть программа, считающая синус какого-либо числа. Для относительно небольших чисел (например 1,2,3...10...20) она делает это правильно (в рамках заданной точности), однако для больших чисел (40 ... 50 ... 100) она начинает выводить какую-то несуразицу, а я не могу понять, где в коде закралась эта ошибка! Помогите пожалуйста исправить!

Код:
#include "stdafx.h"
#include<stdio.h>
#include<math.h>
void main()
{
int k=1;
double x,d,s,e,y;
printf("\n Vvedite x=");scanf("%lf", &x);
printf("\n Zadajte to4nost' e=");scanf("%lf", &e);
s=x;
d=x;
do{d=-d*x*x/((k+2)*(k+1));
   s=s+d;
   k=k+2;}
while(fabs(d)>=e);
printf("sin(%lf)=%lf",x,s);
scanf("%lf %lf",&x,&s);
}

Последний раз редактировалось PPPPPP; 18.04.2010 в 17:42.
PPPPPP вне форума Ответить с цитированием
Старый 18.04.2010, 19:55   #2
PPPPPP
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 22
По умолчанию

Помогите! Очень надо!!
PPPPPP вне форума Ответить с цитированием
Старый 18.04.2010, 20:05   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Ошибка не в коде — а в надежде! На то, что разрядность чисел бесконечна.

Это же естественно, что в ряду Тейлора (Маклорена) погрешность растёт. Лавинообразно!

В случае с синусом вы попадаете, на каком-то шаге, даже не в ту четверть.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 18.04.2010, 20:12   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

У Вас при x > 40 и при k в районе 40 возникает ситуация, когда числитель какое-то время превышает знаменатель на 18 порядков (с дальнейшим ростом x - ещё больше). Это больше разрядности мантиссы числа double. После деления на бумаге получается член ряда, а в ЦВМ - число без единой верной цифры. Пользуясь тем, что синус - периодическая ф-я, загоните аргумент перед началом вычисления ряда в интервал [0, 2*Pi] (или [-Pi, Pi]), и всё станет на свои места.
Vago вне форума Ответить с цитированием
Старый 18.04.2010, 20:57   #5
PPPPPP
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 22
По умолчанию

А Вы не могли бы помочь мне это записать!? У меня не получается ((
PPPPPP вне форума Ответить с цитированием
Старый 18.04.2010, 21:13   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
const double PI = 4.*atan( 1. );
int nFooPeriods = (int) (x / (2.*PI));
double xReduced = x - ((double)nFooPeriods * 2. * PI );
Ну и дальше считаете ряд от xReduced.
Vago вне форума Ответить с цитированием
Старый 18.04.2010, 21:45   #7
PPPPPP
Пользователь
 
Регистрация: 28.02.2010
Сообщений: 22
Смущение

не могу вставить...
не считает..
не могли бы Вы прикрутить этот код к моей программе!?
Заранее спасибо!
PPPPPP вне форума Ответить с цитированием
Старый 18.04.2010, 21:58   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Код:
#include <math.h>
#include <stdio.h>

main() {

   const double PI = 4.*atan( 1. );
   int      k=1,
            nFooPeriods;
   double x, xReduced, d, s, e ;

   printf("\n Vvedite x=");scanf("%lf", &x);
   printf("\n Zadajte to4nost' e=");scanf("%lf", &e);
   
   nFooPeriods = (int) (x / (2.*PI)) ;
   xReduced = x - ((double)nFooPeriods * 2. * PI );
   s = xReduced;
   d = xReduced;

   do {
      d = -d*xReduced*xReduced/((k+2)*(k+1));
      s = s + d;
      k=k+2;
   } while ( fabs(d)>=e );

   printf( "sin(%lf) = %lf",x,s);

   return 0;

}
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа на Си.Подскажите где ошибка champion92 Общие вопросы C/C++ 1 08.12.2009 20:03
Программа с использованием STL. Где ошибка?! Jarik Общие вопросы C/C++ 1 04.03.2009 10:32
Где прочитать про WinApi? jurij Win Api 1 27.05.2008 13:32
что делает эта программа и где ошибка? дангер Паскаль, Turbo Pascal, PascalABC.NET 27 28.01.2008 13:38