IPB
ЛогинПароль:

 
 Ответить  Открыть новую тему 
> Погрешность вычисления
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;


М
Название темы отредактировано.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 18.06.2008 0:36
Сообщение #2


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Погрешность вычислений...

program pr;
var i: real;
begin
i:=0;
while i<=1 do
begin
writeln(i);
i:=i+0.5;
end;
writeln(i);
readln;
end.

выдаст тебе 1.5

вот такое - тоже правильно посчитает (1.1):
program pr;
var i: double;
begin
i:=0;
while i<=1 do
begin
writeln(i);
i:=i+0.1;
end;
writeln(i);
readln;
end.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kosyak
сообщение 18.06.2008 0:55
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


blink.gif Вот это дааа... погрешность в 0,1. Многовато будет
Насклько я знаю тип real вообще не очень хороший
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 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


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
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.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
мисс_граффити
сообщение 18.06.2008 12:51
Сообщение #6


просто человек
******

Группа: Модераторы
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


не накапливается достаточной погрешности.
а если сделаешь не до 0.1, а до 1 (даже до 0.3) - уже не работает.


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kosyak
сообщение 18.06.2008 13:52
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 100
Пол: Мужской

Репутация: -  0  +


Да уж... век живи - век учись smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
andriano
сообщение 18.06.2008 20:29
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


В Турбо Паскале и в Делфи real - разные типы, поэтому и ведут себя по разному (например, с точки зрения округления). К счастью, эта разница сказывается исключительно в неправильно написанных программах.
А как производить вычисления правильно, есть целая наука, называется - численные методы.

Так что сабж неверен: ошибка не Паскаля, а автора программы.

Сообщение отредактировано: andriano - 18.06.2008 20:30
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 29.03.2024 18:48
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"