Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Занятная бага. Как побороть?


ПЛОВ1 ©   (25.09.17 21:54

Друзья, подскажите, как мне отловить проблему?
Впервые сталкиваюсь с такой интересной багой... Куда копать даже не представляю))
Вообщем есть две переменных, значения которых вроде как равны (по данным отладчика), а вот >= между ними говорит что False. Как такое возможно???

Скрин с отладчика:
http://savepic.net/9994213.htm


kilkennycat ©   (25.09.17 22:01[1]

p - что за тип? сравнение вещественных меж с собой и с другими типами - это уже многократно обсуждалось.


kilkennycat ©   (25.09.17 22:03[2]

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.Math.SameValue


ПЛОВ1 ©   (25.09.17 22:09[3]

TPoint2D = record
   x, y: Double;
 end;


ПЛОВ1 ©   (25.09.17 22:10[4]

Double и там и там


ПЛОВ1 ©   (25.09.17 22:34[5]

Вообщем, разобрался. Помогло что-то наподобии SameValue только собственного приготовления и код вроде

b_min_x := (p.x > min_x) or geomlib.Equal(p.x, min_x, geomlib.EQU_PRECISSION);

но такие костыли не радуют((


Юрий Зотов ©   (25.09.17 22:55[6]

> ПЛОВ1 ©   (25.09.17 22:34) [5]

Это не костыли, а учет особенностей машинной арифметики вещественных чисел. Увы, их действительно приходится учитывать, так уж устроена машина.

http://delphikingdom.com/asp/viewitem.asp?catalogid=374


KilkennyCat ©   (25.09.17 23:52[7]


> костыли не радуют((

не используй точку. ведь всё относительно.


картман ©   (26.09.17 00:15[8]

NaN <> NaN

Кстати, как он устроен(я не про 0.0/0.0) - что лежит в переменной?


картман ©   (26.09.17 00:21[9]

нашел:
NaN

Some operations of floating-point arithmetic are invalid, such as taking the square root of a negative number. The act of reaching an invalid result is called a floating-point exception. An exceptional result is represented by a special code called a NaN, for "Not a Number". All NaNs in IEEE 754-1985 have this format:

   sign = either 0 or 1.
   biased exponent = all 1 bits.
   fraction = anything except all 0 bits (since all 0 bits represents infinity).


Leonid Troyanovsky ©   (26.09.17 00:52[10]


> картман ©   (26.09.17 00:15) [8]

> Кстати, как он устроен(я не про 0.0/0.0) - что лежит в переменной?

RTFM: Delphi help: Real Types. The Double type

An 8-byte (64-bit) Double number is divided into three fields
s[1]e[11]f[52]

The value v of the number is given by
,,
if e = 2047 and f <> 0, then v is a NaN

--
Regards, LVT.


Inovet ©   (26.09.17 06:52[11]

> [7] KilkennyCat ©   (25.09.17 23:52)
> не используй точку. ведь всё относительно.

Если надо с фиксированной точкой, а если надо именно с плавающей точкой, то её и надо использовать.


ПЛОВ1 ©   (26.09.17 08:05[12]


> Это не костыли, а учет особенностей машинной арифметики
> вещественных чисел. Увы, их действительно приходится учитывать,
>  так уж устроена машина.http://delphikingdom.com/asp/viewitem.
> asp?catalogid=374


Спасибо, почитаем.
Еще понял что нужно весь код перелопатить на предмет таких сюрпрайзов))


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо