Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-1084029544
freak
2004-05-08 19:19
2004.07.04
Как по UDP (используя Indy) передать файл поблочно.


1-1087299040
mmb
2004-06-15 15:30
2004.07.04
Как перехватить вывод в stdin из функции загруженной из DLL


14-1087046197
Pat
2004-06-12 17:16
2004.07.04
Магистратура


1-1087543797
snake2003
2004-06-18 11:29
2004.07.04
не отображаются компоненты


1-1087906257
Anton.
2004-06-22 16:10
2004.07.04
TComboBox





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский