- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
type func = function (x : real) : real;
const
eps = 0.0000003;
pi = 3.14159265358979;
function Integral (f : func; a, b : real) : real;
var center : real;
begin
center := (a + b) / 2;
if abs(b - a) < eps then
Integral := f(center) * (b - a)
else Integral := Integral(f, a, center) +
Integral(f, center, b);
end;
function myFunc(x : real) : real;
begin
myFunc := cos(x) / x;
end;
begin
writeln(Integral(myFunc, pi/2, pi));
readln;
end.
Нехуй. Пускай запускают коконсольные проги как положено.
> Говорят, что иначе воняет сильно.
По-моему, это наоборот хорошо: сразу видно, что вывела программа именно сейчас, а не три запуска назад, когда студент ещё не исправил баг.
Пожалейте преподавателей. И так постоянно надо переключать контекст, а Вы ещё и логи фильтровать заставляете.
Тут как раз можно плавно и естественно подвести к дебаг/релиз версиям . В c/c++ можно сразу писать
P.S. Что-то внезапно решил проверить комментарии на ГК. Открыл страницу за несколько секунд до того, как пришло письмо.
> дурачек
Нет, я подозреваю, что вы и есть школьник. Ещё не дошли до тех классов, в которых проходят правописание частиц и о-ё после шипящих.
Подсказка: (pi - pi/2) / 0.0000003 = 5 мильонов.
Каждый такой вызов сохраняет в стеке 2 × (адрес возврата + значение (E)BP + три параметра вызова + локальную переменную center).
Если лабы пишут по старинке в 16-битном ТП, то у нас в стеке максимум 64 килобайта. Вызов функции Integral сожрёт 4 + 2 + (4 + 6 + 6) + 6 = 28 байт (хотя я не помню, выравнивается ли real, нужно сконпелировать и проверить). Стека хватит на какую-то жалкую тысячу точек, но не на миллионы.
Да, стека хватит. Глубина рекурсии будет всего 22-23.
Выхлоп:
Ну да, стека действительно хватает. Что-то я разбежался...
Но в любом случае здесь много ненужных прыжков и умножений. Тормозить же будет.
А ты видимо предлагаешь тупо взять ЭН равномерно взятых точек и тупо сложить, но "простая" схема не позволяет вовремя остановиться, эн надо взять заренее. А ещё "простая" схема уязвима для плавающего питуха, потому что когда ты будет прибавлять последний эпсилон к миллионной сумме предыдущих чисел, то у тебя будет ну ты понел.
По-прежнему в силе защита от плавающего питуха.
используя два сумматора
короче. такой рекурсией проще и не намного менее надёжно