Погрешность вычисления |
Погрешность вычисления |
kosyak |
18.06.2008 0:11
Сообщение
#1
|
|||
Пионер Группа: Пользователи Сообщений: 100 Пол: Мужской Репутация: 0 |
Прошу прощение, если тема не в том разделе и может об этом было уже сказано (я не нашел)
Кто-нибудь может объяснить, почему так? Код program pr; var i: real; begin i:=0; while i<=1 do begin writeln(i); i:=i+0.1; end; writeln(i); readln; end. По всем правилам программа последним числом должна вывести 1,1... Но нет!! Она выводит 1.... Причем Delphi при аналогичном коде выводит правильно: Код procedure TForm1.Button1Click(Sender: TObject); var i: real; begin i:=0; while i<=1 do begin memo1.Lines.Add(floattostr(i)); i:=i+0.1; end; memo1.Lines.Add(floattostr(i)); end;
|
|||
мисс_граффити |
18.06.2008 0:36
Сообщение
#2
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
Погрешность вычислений...
program pr; выдаст тебе 1.5 вот такое - тоже правильно посчитает (1.1): program pr; -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
kosyak |
18.06.2008 0:55
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 100 Пол: Мужской Репутация: 0 |
Вот это дааа... погрешность в 0,1. Многовато будет
Насклько я знаю тип real вообще не очень хороший |
мисс_граффити |
18.06.2008 1:22
Сообщение
#4
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
погрешность не в 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 -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
kosyak |
18.06.2008 11:49
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 100 Пол: Мужской Репутация: 0 |
А почему тогда вот это работает?
Код program pr; var i: real; begin i:=0; while i<=0.1 do begin writeln(i); i:=i+0.01; end; writeln(i); readln; end. |
мисс_граффити |
18.06.2008 12:51
Сообщение
#6
|
просто человек Группа: Модераторы Сообщений: 3 641 Пол: Женский Реальное имя: Юлия Репутация: 55 |
не накапливается достаточной погрешности.
а если сделаешь не до 0.1, а до 1 (даже до 0.3) - уже не работает. -------------------- Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения! |
kosyak |
18.06.2008 13:52
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 100 Пол: Мужской Репутация: 0 |
Да уж... век живи - век учись
|
andriano |
18.06.2008 20:29
Сообщение
#8
|
Гуру Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: 28 |
В Турбо Паскале и в Делфи real - разные типы, поэтому и ведут себя по разному (например, с точки зрения округления). К счастью, эта разница сказывается исключительно в неправильно написанных программах.
А как производить вычисления правильно, есть целая наука, называется - численные методы. Так что сабж неверен: ошибка не Паскаля, а автора программы. Сообщение отредактировано: andriano - 18.06.2008 20:30 |
Текстовая версия | 29.03.2024 15:22 |