![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Single [D6, WinXP]
фантазер © (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