Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

Single   Найти похожие ветки 

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

Здравствуйте все. У меня видимо крыша едет, или я чего-то не понимаю. Вообщем проблема такая:
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.
Я в отчаянии. Как мне работать с дробными значениями, если такое творится. Мож я чего не понимаю (скорее так и есть), тогда чего?
Помогите пожалуйста.


 
Рамиль ©   (2004-06-16 13:26) [1]

Вещественные числа нельзя сравнивать.
Можно так
if abs(i - j) < Delta then ...
где Delta - необходимая точность сравнения


 
Рамиль ©   (2004-06-16 13:30) [2]


> Вещественные числа нельзя сравнивать.

вернее нельзя сравнивать на равенство:)


 
Ozone ©   (2004-06-16 13:34) [3]

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


 
Anatoly Podgoretsky ©   (2004-06-16 13:50) [4]

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


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

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


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

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


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


> Можно

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


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


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

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


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


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

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


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

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


 
Amoeba ©   (2004-06-16 16:12) [11]

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


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


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

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

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

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


 
Anatoly Podgoretsky ©   (2004-06-16 16:16) [13]

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


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

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


 
Sandman25 ©   (2004-06-16 17:38) [15]

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

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


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


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

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


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

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


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

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

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


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

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


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


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

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

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


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

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


 
Anatoly Podgoretsky ©   (2004-06-16 20:54) [22]

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



Страницы: 1 вся ветка

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
14-1085824969
Kerk
2004-05-29 14:02
2004.07.04
Концлагеря третьего тысячелетия


3-1086755105
HeathRow
2004-06-09 08:25
2004.07.04
Символ окончания строки


4-1083919701
Сашенька
2004-05-07 12:48
2004.07.04
ScreenShot


1-1087481169
p_sA[11]
2004-06-17 18:06
2004.07.04
Реестр: Как прочитать все имена ключей в нужном мне разделе?


1-1087467812
Aleksandr.
2004-06-17 14:23
2004.07.04
Как "безусловно" уничтожить поток?