Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Single [D6, WinXP]


Страницы:   1 2

фантазер ©   (2004-06-16 13:20:00) 

Здравствуйте все. У меня видимо крыша едет, или я чего-то не понимаю. Вообщем проблема такая:
procedure TForm1.Button1Click(Sender: TObject);
var i,j:single;
begin
i:=0.1;
j:=0;
i:=i-0.1;
if (i)=j then caption:='OK' else caption:='Wrong';
end;

Здесь, в заголовке выводится Wrong. Почему, понять не могу. Значение i после присваивания 0.1 становится 0.10000000149, т.е. не ровно 0.1, а после отнимания - вообще 1.4901161416e-09.
Я в отчаянии. Как мне работать с дробными значениями, если такое творится. Мож я чего не понимаю (скорее так и есть), тогда чего?
Помогите пожалуйста.


Anatoly Podgoretsky   (2004-06-16 20:54:00) [1]

Читай, статья полезная, будешь точно представлять что там происходит, не помню есть ли там информация, но все операции производятся над Extended


фантазер   (2004-06-16 20:45:00) [2]

ОК.
Ушёл внимательно читать статью.
Ещё раз спасибо!


Тимохов   (2004-06-16 18:06:00) [3]


> фантазер   (16.06.04 18:01) [18]

прочтите внимательно статью, которую я вам првел выше. там это все подробно разъяснено на примере 1/5.

0.1 не может быть представлено точно в двочной логике.


фантазер   (2004-06-16 18:02:00) [4]

> Anatoly Podgoretsky ©   (16.06.04 18:00) [17]
Пока писал свой пост, ответели.


фантазер   (2004-06-16 18:01:00) [5]

> Sandman25 ©   (16.06.04 17:38) [15]
:)))
Я имел ввиду, чтобы она была со знаком.

> Тимохов ©   (16.06.04 17:45) [16]
Для работы, значит чтобы такое вот как в начале работало, т.е. выдавало не Wrong а OK


Anatoly Podgoretsky   (2004-06-16 18:00:00) [6]

Она никогда не будет 0,1 такое число невозможно точно представить в плавающей запятой.


Тимохов   (2004-06-16 17:45:00) [7]


> Ааа. Тогда ясно. А как можно округлить переменную i. Только
> не для вывода на экран, а для работы

ааа
тогда совсем не ясно, что вы хотели спросить - что значит "для работы"?


Sandman25   (2004-06-16 17:38:00) [8]

Т.е. чтобы она была 0.1, но при этом могла быть и -0.1.

I := (1 - random(2) shl 1) * 0.1 :)


фантазер   (2004-06-16 17:36:00) [9]

Ааа. Тогда ясно. А как можно округлить переменную i. Только не для вывода на экран, а для работы. Т.е. чтобы она была 0.1, но при этом могла быть и -0.1.


Anatoly Podgoretsky   (2004-06-16 16:16:00) [10]

А при вычитании операции будут с Extended


Тимохов   (2004-06-16 16:15:00) [11]


> фантазер   (16.06.04 16:08) [10]

потому же почему в десятичной системе присвоис числу 1/3 не получишь конечную дробь.

в десятичной системе 1/5 представляется радостно - 0.2.

в двоичной же нет


Amoeba   (2004-06-16 16:12:00) [12]

Так уж работает FPU процессора...


фантазер   (2004-06-16 16:08:00) [13]

А вот я всёже не понял, почему при присвоении i:=0.1, результат становиться 0.10000000149, а при вычитании (от того же, присвоенного i) - 1.4901161416e-09


Рамиль   (2004-06-16 15:16:00) [14]


> [4] Anatoly Podgoretsky ©   (16.06.04 13:50)

Ну, например, бледные поганки тоже кушать можно, но результат:)


Тимохов   (2004-06-16 14:34:00) [15]


> evvcom ©   (16.06.04 14:22) [7]

это точности никаких чисел не хватит :)


evvcom   (2004-06-16 14:22:00) [16]


> Можно

Но нужно помнить, что точности вещественных типов, особенно Single, может не хватить для того чтобы 0.1 было бы точно равно 0.1.


фантазер   (2004-06-16 14:18:00) [17]

Огромное всем спасибо!! Помогло!!
А статью я обязательно прочту. Будет мне уроком!!
Ещё раз спасибо.


Тимохов   (2004-06-16 13:53:00) [18]

http://www.delphikingdom.ru/helloworld/reals.htm


Anatoly Podgoretsky   (2004-06-16 13:50:00) [19]

Рамиль ©   (16.06.04 13:30) [2]
Можно


Ozone   (2004-06-16 13:34:00) [20]

http://www.rsdn.ru/Forum/Message.aspx?mid=664130


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо