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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2010, 12:23   #1
Eovin
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 11
По умолчанию Сумма ряда в С

IDE Pelles C, задание :
Вычислить сумму ряда (приближенное значение функции arctg для |x|<1) с точностью eps. Значения x и eps вводятся с клавиатуры. Полученный результат и значение библиотечной функции arctg вывести на экран.
ряд.bmp - собсно ряд.
Код:
#include<stdio.h>
#include<math.h>
int main (int argc, char *argv[])
{      int i;
	double arctg,a,x,t,eps;
	printf("vvedite x,eps\n");
	scanf("%lf %lf", &x,&eps);
	if (x>1 || x<-1) 
               {puts("Enter -1<x<1");
		         return 0;
	        }
	
	else {   arctg=0;
		   i=0;
		   double _arctg=x;
                   t=x;
		   while (labs(arctg-_arctg)>eps) 
			{      arctg=_arctg;
				i=i+1;
				t=t*x*x;
				if(i&1) _arctg=_arctg-(t/(2*i+1));
				else _arctg=_arctg+(t/(2*i+1));
			}
	        }
	arctg=floor(arctg/eps)*eps;
	printf("Znachenie funkcii = %lf\n", arctg); 
	return 0;
}
Вопрос заключается в следующем: мне нужно, например, вывести результат 0,12345678 с точностью 0,00001, т.е. 0,12346. У меня же получается 0,123460. А если с точностью 0,0000001 - имеем 0,123457. Как-то так, криво. В общем помогите нормальный вывод сделать.
И еще - что за "значение библиотечной функции arctg "? Это просто вывести значение арктангенса введенного числа?
Какой мне странный сон приснился, - подумала Алиса и побежала домой, чтобы не опоздать к чаю.

Последний раз редактировалось Eovin; 12.03.2010 в 13:11. Причина: ошибка в коде
Eovin вне форума Ответить с цитированием
Старый 12.03.2010, 13:29   #2
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Вы, вообще, на результат, выводимый своей программой, смотрели? Он Вас не смутил?.. У меня, например, выдаётся 0, какое бы x я ни вводил... А i, заодно с результатом, распечатать не пробовали? То, что оно остаётся нулём, какую бы точность ни задали, не удивило?..
Vago вне форума Ответить с цитированием
Старый 12.03.2010, 13:33   #3
Eovin
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 11
По умолчанию

Ого, нет не смотрела, признаюсь =/ и в чем тут проблема?
Какой мне странный сон приснился, - подумала Алиса и побежала домой, чтобы не опоздать к чаю.

Последний раз редактировалось Eovin; 12.03.2010 в 13:38.
Eovin вне форума Ответить с цитированием
Старый 12.03.2010, 13:46   #4
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Значит, у кого-то из нас - "неправильный мёд"... У Вас, похоже, транслятор (long) double превращает в long double, а у меня - в long int. Чтобы не было недоразумений, labs() на fabs() поменяйте, от греха подальше.

Цитата:
Сообщение от Eovin Посмотреть сообщение
Код:
arctg=floor(arctg/eps)*eps;
Это, вообще-то, опасный фокус. И, чем меньше eps, тем опаснее. Просто, уберите эту строку вообще. Точность у Вас и так достигается.

Цитата:
Сообщение от Eovin Посмотреть сообщение
И еще - что за "значение библиотечной функции arctg "?
Библиотечная ф-я atan()
Vago вне форума Ответить с цитированием
Старый 12.03.2010, 13:48   #5
Eovin
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 11
По умолчанию

0 там получается если ввести 1, значит не работает нормально проверка на ввод -1<x<1.
И насчет точности: вот если я задаю например 0,00000001, то все равно в ответе получаю число с точностью 0,000001.
Какой мне странный сон приснился, - подумала Алиса и побежала домой, чтобы не опоздать к чаю.

Последний раз редактировалось Eovin; 12.03.2010 в 13:51.
Eovin вне форума Ответить с цитированием
Старый 12.03.2010, 14:17   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Ещё раз. Медленно. По пунктам...

1. 0 (и i=0) я получаю всегда, кроме крайних значений (-1 и 1). Причина этого - использование Вами для принятия решения о выходе из итерационного цикла ф-ии labs(), которая ожидает аргументя типа long. О том, что будет конверсия с непредсказуемым р-том, M$VC 6 меня честно предупредил на этапе трансляции. Как только я ставлю туда fabs(), программа начинает считать нормально.

2. В подправленной программе для -1 и +1 у меня всё считается нормально (-0.785 и 0.785 соответственно).

Цитата:
Сообщение от Eovin Посмотреть сообщение
И насчет точности: вот если я задаю например 0,00000001, то все равно в ответе получаю число с точностью 0,000001.
3.а Ещё раз повторяю - уберите floor(),
3.b Укажите явно длины дробной части в полях форматов вывода, например "%.10g".
Vago вне форума Ответить с цитированием
Старый 12.03.2010, 15:21   #7
Eovin
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 11
По умолчанию

Удалила, поменяла, причем с первого раза. Ну вроде как работает, так у меня условие -1<x<1, значит х не может равняться -1 и 1. Я или условия неправильно записала или уже запуталась. А явно размер я задавала - ну так тогда нули остаются, я ж заранее не знаю какую точность пользователь выберет.
Какой мне странный сон приснился, - подумала Алиса и побежала домой, чтобы не опоздать к чаю.
Eovin вне форума Ответить с цитированием
Старый 12.03.2010, 15:27   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Eovin Посмотреть сообщение
у меня условие -1<x<1, значит х не может равняться -1 и 1.
Ну так включите тогда концы интервала в условие, отсекающее неверно введённые значения x:
Код:
if ( x >= 1 || x <= -1 )
Vago вне форума Ответить с цитированием
Старый 12.03.2010, 15:29   #9
Eovin
Пользователь
 
Регистрация: 20.12.2009
Сообщений: 11
По умолчанию

Да, сама уже нашла))
Стыдно-то как - такую мелочь не заметила...)
Ну и в итоге все равно выводит не так как мне хочется
Какой мне странный сон приснился, - подумала Алиса и побежала домой, чтобы не опоздать к чаю.

Последний раз редактировалось Eovin; 12.03.2010 в 15:50.
Eovin вне форума Ответить с цитированием
Старый 12.03.2010, 16:03   #10
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Eovin Посмотреть сообщение
Ну и в итоге все равно выводит не так как мне хочется
Код:
   int nDecimalDigits = 1 + (int) log10(1./eps);
   printf( "Znachenie funkcii = %.*g\n", nDecimalDigits, arctg );
Vago вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма ряда Sova123456 Помощь студентам 8 11.06.2010 17:10
Сумма ряда [Delphi] StudeHt Помощь студентам 0 15.12.2009 01:59
Сумма ряда QuadroX Помощь студентам 3 05.11.2009 16:02
Сумма ряда eKStaSy Помощь студентам 4 25.10.2009 17:41