IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача о справедливости равенства!, Помогите исправить, пожалуйста!:=)
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


Люди! Я написала программу на Паскале, но она как-то странно работает. Я не понимаю в каком месте ошибочка. Помогите,ПОЖАЛУЙСТА!
Вот условие задачи:
Численно убедиться в справедливости равенства, для чего для заданного значения аргумента х вычислить левую его часть и разложение, стоящее в правой части, с заданной погрешностью e. Оценить число итераций, необходимых для достижения заданной точности.
равенство:
mega_chok.gif sinx=x(1-(x*x/(pi*pi))(1-(x*x/4(pi*pi))...(1-(x*x/((n-1)*(n-1)*pi*pi)))....

Вот так вот....
Моя программа:
Program RGZ3;
Uses crt;
var
x,Eps,a,b,y,P:real;
n:integer;
begin
clrscr;
write('Задайте значение аргумента х=');
readln(x);
write('Введите погрешность е=');
readln(Eps);
P:=x;
y:=sin(x);
n:=2;
repeat
a:=((n-1)*(n-1))*pi*pi;
b:=1-((x*x)/a);
n:=n+(n-1);
P:=p*b;
until ABS(y-p)<=Eps;
if ABS(y-p)<=Eps then write('Равенство справедливо')
else write('Равенство не справедливо');
readln;
end.

Заранее ОГРОМНОЕ СПАСИБО!:=) smile.gif

Сообщение отредактировано: Lapp -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Если честно, никаких странностей (кроме нарушения тобой п.2 правил) не заметила.
На больших х вылетает с делением на ноль - ты про это?

Может, напишешь подробнее, в чем проблема? На каких значениях что-то не то получается?
И еще меня немножко смутило
Цитата
n:=n+(n-1);

Это по формуле так?
Почему не n:=n+1?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 3
Пол: Женский

Репутация: -  0  +


На больших х вылетает с делением на ноль - ты про это?


Да, именно про это.

Цитата
Это по формуле так?
Почему не n:=n+1?


Получается ,чтобы не выходило деление на 0 необходимо первоначально задать п=2. Иначи выходит: 1-1=0, а это знаменатель....Вот...Немного бредово...но всё же.


Спасибо,что откликнулисьsmile.gif

Сообщение отредактировано: Lapp -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Клавиатурный тиран
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской
Реальное имя: Дмитрий

Репутация: -  -2  +


Чтобы не вылетало на больших углах, нужно заменять их меньшими. Например,

repeat
x:=x-2*Pi; //в силу периодичности функции
until x<=2*Pi


Сообщение отредактировано: Sozialist -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Olchik, ты не поняла, что сказала мисс_граффити:
Цитата(мисс_граффити @ 20.11.2007 1:21) *
Цитата
n:=n+(n-1);
Это по формуле так?
Почему не n:=n+1?
Ты ответила:
Цитата(Olchik @ 20.11.2007 3:44) *
Получается ,чтобы не выходило деление на 0 необходимо первоначально задать п=2. Иначи выходит: 1-1=0, а это знаменатель....Вот...Немного бредово...но всё же.
- что совешенно не по теме sad.gif. Да, начинать нужно с n=2 при P=x, кто ж спорит? И ничего бредового в этом нет, даже немного. А вот это твое:
Цитата
n:=n+(n-1);
- это действительно полнейший бред (не немного smile.gif). Конечно, нужно писать так, как намекала мисс_граффити:
n:=n+1;
Это же следует из написанной тобой формулы!.. Понятно?
Цитата(Sozialist @ 20.11.2007 5:02) *

Чтобы не вылетало на больших углах, нужно заменять их меньшими.
...
x:=x-2*Pi; //в силу периодичности функции
Sozialist, ты не прав. Ты еще не доказал, что эта предел этой последовательности действительно синус, а уже пользуешься его, синуса, свойствами.. Нехорошо! smile.gif

Olchik, задача не так проста, как кажется на первый взгляд. В ней есть несколько подводных камней, даже для знающего программиста. Я тебе сейчас немного начну намекать на них, а ты попробуй разобраться и задавай вопросы. Ладно?

1. Во-первых, надо исправить ту ошибку, про которую говорила мисс_граффити, это несомненно.

2. В процессе вычислений получаются очень большие значения. Как ты знаешь, числа, с которыми имеет дело компьютер, ограничены по величине. Например, числа типа real ограничены примерно числом 10^38, а тип double простирается до 10^308. Та последовательность, с которой ты имеешь дело, сходится чрезвычайно медленно, но дело даже не в скорости схождения. Дело в том, что она сначала колеблется с очень большой амплитудой. То есть, прежде, чем сойтись, она очень сильно отклоняется, как в плюс, так и в минус. То есть программа действительно вылетает при больших X, но не из-за ошибки, а из-за ограниченных возможностей машины. Отсюда следуют несколько выводов сразу:
- для n следует использовать не integer тип, а real;
- для всех действительных величин следует использовать не real тип, а double (а может, и extended);
- следует организовать последовательность так, чтобы минимизировать величину промежуточных результатов.
Только пусть у тебя не сложится мнение, что если уж "машина не может, то и стараться нечего". Машина может ВСЕ, если ее правильно использовать..

3. В твоей программе нарушена логика. Посмотри вниметельно: фраза "Равенство не справедливо" в принципе не может быть напечатана, так как мы не можем выйти из цикла, пока не достигли точности Eps. Подумай, что нужно сделать, чтоб исправить это.

И приходи продолжать разговор.. smile.gif))

Теперь от меня, как от администратора.
М
Тут не принято дублировать темы. Начала тут: вычисление с погрешностью((( - надо было тут и продолжать.. Учти это на будущее, пожалуйста



--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 12:20
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name