Табулирование функции. Проверьте реализацию.

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
c0zak
Сообщения: 17
Зарегистрирован: 04 мар 2009, 23:07
Контактная информация:

Здрасте ))) Мне тут попросили написать на паскале функцию (число пи=pi) P=(-1)^x*cos((pi/4)+(x/25))/(pi/4)+(x/25); х-от 0 до 10, шаг-1 и с отправкой результатов в файл
Реализовал так:

[syntax=Pascal]
program zoch;
var P, x, pi, c, d, g :real;
outf :text;
begin
assign(outf, 'zoch.txt');
rewrite(outf);
pi:=3.14;
x:=0;
while x<=10 do begin
if int(x/2)=x/2
then c:=1
else c:=-1;
d:=(pi/4)+(x/25);
g:=exp(x*(ln(1)))*c;
P:=(g*cos(d))/d;
writeln(outf,'If x=',x:1:0,' then P=',P:7:4);
x:=x+1;
end;
close(outf);
end.

[/syntax]

Лично мне нравится но может есть какие то скрытые баги?
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Перенес из тему "Алгоритмы", так как с точки зрения алгоритмов тут ничего примечательного.
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Скрытые баги всегда есть ;)

1) Используйте функцию Pi (для этого надо убрать объявление и присвоение одноименной переменной).
2) Я бы заменил while на for
3) ... и тогда X была бы целым числом и можно было бы отказаться от вычисдения Exp(Ln()) а просто определять знак по четности числа
4) Опс! Кстати! А зачем Вам переменная C? (Или G) Одна из них не нужна. Вы уж либо определяйте знак по четности числа, либо возводлите -1 в степень. Что-нибудь одно. Иначе у Вас все время получает противоположный знак!
Вообще exp(X*(ln(1))) всегда дает единицу, которую Вы умножаете на.... Вобщем Вы тут все напутали :)

5) еще в догонку int(x/2)=x/2 в вещественном типе может запросто пропустить кратность числа из-за ошибки округления. При делении на 2 это конечно весьма мало вероятно, но в общем - это реальный скрытый баг.

Вобщем надо, например, так:

[syntax=pascal]
program zoch;
var
P, c, d:real;
x: integer;
outf :text;
begin
assign(outf, 'zoch.txt');
rewrite(outf);
for x:=0 to 10 do begin
if odd(x) then c:=-1 else c:=1;
d:=(pi/4)+(x/25);
P:=(c*cos(d))/d;
writeln(outf,'If x=',x:2,' then P=',P:7:4);
end;
close(outf);
end.
[/syntax]

Слева мой вывод, справа Ваш. Сравните. Мой правильнее ;)

Код: Выделить всё

If x= 0 then P= 0.9003      If x=0 then P= 0.9011
If x= 1 then P=-0.8217      If x=1 then P=-0.8225
If x= 2 then P= 0.7492      If x=2 then P= 0.7499
If x= 3 then P=-0.6819      If x=3 then P=-0.6825
If x= 4 then P= 0.6192      If x=4 then P= 0.6198
If x= 5 then P=-0.5607      If x=5 then P=-0.5613
If x= 6 then P= 0.5059      If x=6 then P= 0.5064
If x= 7 then P=-0.4544      If x=7 then P=-0.4549
If x= 8 then P= 0.4060      If x=8 then P= 0.4065
If x= 9 then P=-0.3603      If x=9 then P=-0.3607
If x=10 then P= 0.3171      If x=10 then P= 0.3176
c0zak
Сообщения: 17
Зарегистрирован: 04 мар 2009, 23:07
Контактная информация:

спасибо ))))
Кириллл
Сообщения: 1
Зарегистрирован: 01 июл 2009, 19:12

а как табулировать функцию 2sinX/cosX
в Visual Basic?
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

как минимум в другом разделе
Изображение
Ответить