Лучший ответ
-
2 0
_Juice_ 4 (2031)36 14 лет
В программе всего 2 места где происходит деление:
f:=-1.0/sqr(k)и
f:=1.0/sqr(k);
В обоих случаях деление происходит на целое число - потому что k:Integer, а sqr() вычисляет квадрат k. Таким образом может казаться, что деление на ноль происходить не может - потому что в основном блоке программы k начинается от 1 и потом только увеличивается в цикле (на +1 при каждой итерации).
Паскаль имеет свою особенность - у всех типов есть максимальное значение. Для Integer - диапазон, кажется, -32768..32767. Если в какой-то момент значение k равно 32767 и к нему прибавляется еще 1, то получается -32768 (то есть как бы начинается отстчет от другого конца диапазона). При последующем увеличении значения в цикле - каждый раз на 1 - отрицательные значения k увеличиваются и достигают нуля. В этот момент происходит деление на ноль.
Скорее всего неправильно задано условие прерывания цикла и он продолжается дольше, чем было задумано. Нужно проверить - при помощи вывода всех значений, как и было предложено.
Возможно также отключить "функцию" Паскаля, которая превращает 32767 + 1 в -32768. Нужно задать какую-то специальную директиву компилятору (ищи в гугле по "arithmetic overflow").
Ответы
-
-
-
0 0
Jointer 1 (152)2 14 лет
Ну блин, трассерни свое k в фунции и корень от нее... где-то он становится равным нулю.
выведи и посмотри
writeln k, sqr(k);
В чем кстать глубинный философский смысл этого выражения ? : \/
if odd(k) then
f:=-1.0/sqr(k)
else
f:=1.0/sqr(k);
end;
f:=-1.0/sqr(k) -
-
-
0 0
Ljolium 6 (19749)453183 14 лет
Division by zero.
это значит ДЕЛЕНИЕ НА НОЛЬ, а оно неправильно.
следовательно, ищем где неправильно. корень из какой переменной равен нулю?
f:=-1.0/sqr(k)
else
f:=1.0/sqr(k);