Консольный проект, если 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.
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.
(2) Благодарю, просто уверенности не было, а в Delphi практически не работал никогда, ничего там вообще не в курсе, чисто на инстинктах:-) Вчера для знакомого просто клепал задачки по контрольной по Pascal на скорую руку:-)
А мне как-то больше всегда через рекурсию нравилось всякие факториалы, ЧислаСочетаний и прочую лабудень.
Еще помнится студенты тащились от фразы на админской каморке "Чтобы понять рекурсию, надо понять рекурсию" :)
(4) “Итерация от человека, рекурсия — от Бога”. (Питер Дойч)
function f(n: integer):integer;
begin
if (n=1) or (n=0) then f:=1 else f:=n*f(n-1);
end;
З.Ы. Вы понимаете в чем дело, если сделать слишком хорошо или красиво, то препод не поверит, что человек писал сам или начнет расспрашивать и т.п. Это один момент, ведь кто хорошо рубит, не будет просить кого-либо написать за него контрольную:-))) Во вторых, в той задаче главное было описать алгоритм нахождения суммы бесконечного ряда слагаемых с заданной точностью, а не показать знания рекурсии или умения разными способами вычислить факториал:-)))