Прошу прощение, если тема не в том разделе и может об этом было уже сказано (я не нашел)
Кто-нибудь может объяснить, почему так?
М | Название темы отредактировано. |
Погрешность вычислений...
program pr;
var i: real;
begin
i:=0;
while i<=1 do
begin
writeln(i);
i:=i+0.5;
end;
writeln(i);
readln;
end.
program pr;
var i: double;
begin
i:=0;
while i<=1 do
begin
writeln(i);
i:=i+0.1;
end;
writeln(i);
readln;
end.
Вот это дааа... погрешность в 0,1. Многовато будет
Насклько я знаю тип real вообще не очень хороший
погрешность не в 0.1 ))))
смотри... 0.1 точно представить не удается (вот 0.5 - можно).
то есть на самом деле у тебя будет идти не
0.0
0.1
0.2
...
1.0
1.1
а, допустим, вот так:
0.0
0.1000000001
0.2000000002
0.3000000003
0.4000000004
..
1.0000000010 <-вот в этом месте и произойдет выход из цикла, т.к. больше 1.
погрешность составит 0.000000001
А почему тогда вот это работает?
не накапливается достаточной погрешности.
а если сделаешь не до 0.1, а до 1 (даже до 0.3) - уже не работает.
Да уж... век живи - век учись
В Турбо Паскале и в Делфи real - разные типы, поэтому и ведут себя по разному (например, с точки зрения округления). К счастью, эта разница сказывается исключительно в неправильно написанных программах.
А как производить вычисления правильно, есть целая наука, называется - численные методы.
Так что сабж неверен: ошибка не Паскаля, а автора программы.