Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Выводит ошибку


Автор: KaTeNoK 27.12.2006, 16:10
Задание:
Не используя стандартные функции, за исключением ABS, вычислить с точностью E (E>0) y=x+x^3/3!+x^5/5!+...+x^(2n+1)/(2n+1)!

мое решение вот такое:
Код

PROGRAM Z_4;
 USES
  CRT;
 VAR
  CH,Eps,X,Y:REAL;
  ZN,N:INTEGER;
 BEGIN
  CLRSCR;
  WRITELN ('Vvedite X, Eps');
  READ (X,Eps);
  N:=1;
  Y:=X;
  ZN:=1;
  REPEAT
   CH:=EXP((2*N+1)*LN(ABS(X)));
   IF X<0
    THEN
     CH:=CH*(-1);
   ZN:=ZN*(2*N+1)*(2*N);
   Y:=Y+CH/ZN;
   N:=N+1
  UNTIL ABS(Y)<Eps;
  WRITE ('Y=', Y:0:5);
  READKEY
 END.


Но он мне выдает ошибку 200 (деление на ноль). Что я неправильно сделала???  smile 

Автор: skyboy 27.12.2006, 16:12
1. на какой строке ошибка?
2. оформляй код при помощи кнопки "код" справа вверху.
3. отключи CRT - возможно, проблемы из его использования

Автор: KaTeNoK 27.12.2006, 16:16
1. на 20-ой
2. оформила (простите, первый раз  smile )
3. раньше с ним проблем не было, написала кучу программ, рнаьше могла с этим бороться, а в этот раз не получается smile

Добавлено @ 16:21 
отключила, все равно выдает эту ошибку

Автор: skyboy 27.12.2006, 17:03
Цитата

  UNTIL ABS(Y)<Eps;

    я не думаю, что "с точностью до Е" - это то же самое, что "пока сумма ряда не станет меньше Е". тем более, что при Х>E сумма никогда не станет меньше Е. а по ошибке деления на ноль вылетает, потому что для ZN ты используешь тип, ограниченный 37767 - рано или поздно, он у тебя переполняется(из-за ошибки в условии выхода из цикла). Переполняется раз, другой, третий... рано или поздно, после преполнения оказывается равным нулю.  думаю, там можно поставить "UNTIL abs(ch/zn)< e".

Добавлено @ 17:05 
Цитата(KaTeNoK @  27.12.2006,  15:16 Найти цитируемый пост)
2. оформила (простите, первый раз

ничего, ничего. если бы ты ещё нажала не на слово "код", а на стрелочку чуть правее - можно было бы выбрать конкретный язык программирования. тогда бы ещё и ключевые слова синтаксиса подсвечивались бы --- так намного удобнее читать текст. особенно чужих программ  smile 

Автор: Zero 27.12.2006, 18:23
Стандартный и самый понятный способ определения точности, это когда разница между предыдущим и текущим значением сравниваеться с точностью:
Код

PROGRAM Z_4;
 USES
  CRT;
 VAR
  CH,Eps,X,Y:REAL;
  ZN,N:longint;
 BEGIN
  CLRSCR;
  WRITELN ('Vvedite X, Eps');
  READ (X,Eps);
  N:=1;
  Y:=X;
  ZN:=1;
  Repeat
    n:=n+2;
    zn:=zn*(n)*(n-1);
    ch:=y;
    y:=y+(exp(n*ln(x))/zn)
  Until ABS(y-ch)<Eps;
  WRITE ('Y=', Y:0:5);
  READKEY
 END.

Автор: volvo877 31.12.2006, 09:46
Цитата(KaTeNoK @  27.12.2006,  15:10 Найти цитируемый пост)
Не используя стандартные функции, за исключением ABS
Exp + Ln - все-таки, ПОКА являются стандартными...

Код
var
  n, znam: longint;
  Eps, X, Y, curr, power: real;
begin
  write('X = '); readln(X);
  write('Eps = '); readln(Eps);
  n := 1; power := X;
  y := X; znam := 1;
  repeat
    n:=n+2;
    znam:=znam*(n)*(n-1);
    curr := y;
    power := power * X * X; { <-- Нет стандартных функций }
    y := y + power / znam;
  until abs(curr - y) < Eps;

  writeln('y = ', y:0:5);
  readln;
end;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)