Кто Pascal (Delphi-5) помнит, мож развеет непонятки

1. venger 2123 11.06.09 14:01 Сейчас в теме
Консольный проект, если x ввести допустим 20, то нормально, но вот если, допустим 100, то вылетает, неужели в какой тип (скорее всего в real при вычислении факториала) не помещается значение и поэтому вылет?

program task_4;
{$APPTYPE CONSOLE}
uses
SysUtils,
Math;

Var flag: boolean;
n, i: integer;
s, x, f, tmp: real;

begin
{ Запрашиваем ввод с клавиатуры числа x }
WriteLn('Enter value of x =');
ReadLn(x);

{ Вычисляем в цикле очередной элемент ряда (слагаемое),
если он больше по модулю значения точности (e=0,00001), то прибавляем его
к итоговой сумме, если нет, прекращаем суммирование и выводим результат }
flag:=true;
n:=1;
s:=3;
while(flag) do
begin
{ вычисляем факториал числа 2*n }
f:=1;
for i:=1 to 2*n do
f:=f*i;
{ вычисляем значение слагаемого, функция Power - степень числа (из Math)}
tmp:=Power(-1,n)*((Power(x,(2*n+1)))/f);
{ если модуль слагаемого больше значения точности,
продолжаем накапливать сумму, если нет заканчиваем суммирование,
выходим из цикла while (флагу задаем false) }
if abs(tmp)>0.00001 then
s:=s+tmp
else
flag:=false;
n:=n+1;
end;
{ печатаем результат, сумму }
WriteLn('Value of summa = ', s);
end.
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. int18h 101 11.06.09 14:18 Сейчас в теме
Вы сами себе ответили...
Выдержка из мануала:

Fundamental real types
Type Range Significant digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10
Comp -2^63+1 .. 2^63 -1 19-20 8
Currency -922337203685477.5808.. 922337203685477.5807 19-20 8
The generic type Real, in its current implementation, is equivalent to Double.

Generic real types
Type Range Significant digits Size in bytes
Real 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Показать

;)
program task_4;
{$APPTYPE CONSOLE}
{$REALCOMPATIBILITY ON} //Добавил

uses
SysUtils,
Math;

Var flag: boolean;
n, i: integer;
s, x, f, tmp: Extended; //Изменил

begin

{ Запрашиваем ввод с клавиатуры числа x }
WriteLn('Enter value of x =');
ReadLn(x);

{ Вычисляем в цикле очередной элемент ряда (слагаемое),
если он больше по модулю значения точности (e=0,00001), то прибавляем его
к итоговой сумме, если нет, прекращаем суммирование и выводим результат }
flag:=true;
n:=1;
s:=3;
while(flag) do
begin
{ вычисляем факториал числа 2*n }
f:=1;
for i:=1 to 2*n do
f:=f*i;
{ вычисляем значение слагаемого, функция Power - степень числа (из Math)}
tmp:=Power(-1,n)*((Power(x,(2*n+1)))/f);
{ если модуль слагаемого больше значения точности,
продолжаем накапливать сумму, если нет заканчиваем суммирование,
выходим из цикла while (флагу задаем false) }
if abs(tmp)>0.00001 then
s:=s+tmp
else
flag:=false;
n:=n+1;
end;
{ печатаем результат, сумму }
WriteLn('Value of summa = ', s);
end.
3. venger 2123 11.06.09 14:40 Сейчас в теме
(2) Благодарю, просто уверенности не было, а в Delphi практически не работал никогда, ничего там вообще не в курсе, чисто на инстинктах:-) Вчера для знакомого просто клепал задачки по контрольной по Pascal на скорую руку:-)
4. sound 536 15.06.09 15:10 Сейчас в теме
А мне как-то больше всегда через рекурсию нравилось всякие факториалы, ЧислаСочетаний и прочую лабудень.
Еще помнится студенты тащились от фразы на админской каморке "Чтобы понять рекурсию, надо понять рекурсию" :)
5. venger 2123 16.06.09 12:14 Сейчас в теме
(4) “Итерация от человека, рекурсия — от Бога”. (Питер Дойч)

function f(n: integer):integer;
begin
if (n=1) or (n=0) then f:=1 else f:=n*f(n-1);
end;

З.Ы. Вы понимаете в чем дело, если сделать слишком хорошо или красиво, то препод не поверит, что человек писал сам или начнет расспрашивать и т.п. Это один момент, ведь кто хорошо рубит, не будет просить кого-либо написать за него контрольную:-))) Во вторых, в той задаче главное было описать алгоритм нахождения суммы бесконечного ряда слагаемых с заданной точностью, а не показать знания рекурсии или умения разными способами вычислить факториал:-)))
6. sound 536 16.06.09 12:35 Сейчас в теме
Ага, преподы они такие, сам когда то преподствовал :)
Кстати факториал нуля вроде тоже равен 1 :)
7. venger 2123 16.06.09 12:54 Сейчас в теме
(6) Гы, точно, поправил:-)

З.Ы. А вот вспомнил, что и в 1С'се игрался с рекурсией: http://infostart.ru/projects/3356/
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот