Конференция "Прочее" » Занятная бага. Как побороть?
 
  • ПЛОВ1 © (25.09.17 21:54) [0]
    Друзья, подскажите, как мне отловить проблему?
    Впервые сталкиваюсь с такой интересной багой... Куда копать даже не представляю))
    Вообщем есть две переменных, значения которых вроде как равны (по данным отладчика), а вот >= между ними говорит что False. Как такое возможно???

    Скрин с отладчика:
    http://savepic.net/9994213.htm
  • kilkennycat © (25.09.17 22:01) [1]
    p - что за тип? сравнение вещественных меж с собой и с другими типами - это уже многократно обсуждалось.
  • kilkennycat © (25.09.17 22:03) [2]
  • ПЛОВ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


    Спасибо, почитаем.
    Еще понял что нужно весь код перелопатить на предмет таких сюрпрайзов))
 
Конференция "Прочее" » Занятная бага. Как побороть?
Есть новые Нет новых   [134430   +1][b:0][p:0]