Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c