Сравнение чисел в Lua

Я проверяю пересечение линии и мне нужно выяснить, находится ли точка пересечения (x,y) в ограничивающей рамке сегмента линии l2 (состоящего из точек p1 и p2)

Следующая распечатка иллюстрирует мою проблему:

точка пересечения (100,300)

print("x",x,">=",math.min(l2.p1.x,l2.p2.x),x >= math.min(l2.p1.x,l2.p2.x))
print("x",x,"<=",math.max(l2.p1.x,l2.p2.x),x <= math.max(l2.p1.x,l2.p2.x))
print("y",y,">=",math.min(l2.p1.y,l2.p2.y),y >= math.min(l2.p1.y,l2.p2.y))
print("y",y,"<=",math.max(l2.p1.y,l2.p2.y),y <= math.max(l2.p1.y,l2.p2.y))

что дает:

x   100 >=  100 true
x   100 <=  100 false
y   300 >=  140 true
y   300 <=  300 false

Что происходит и как это можно исправить?

(Луа версии 5.2.3)


person Mikkel Leivsen    schedule 24.09.2015    source источник
comment
Я не смог воспроизвести вашу проблему. Пожалуйста, предоставьте минимальный, полный пример, иллюстрирующий это.   -  person Bartek Banachewicz    schedule 24.09.2015
comment
Мне не удалось создать минимальный пример, выдающий ту же ошибку, но код доступен здесь github.com/mhml92 /lineSegmentVisibility Хотя для его запуска вам потребуется фреймворк love2d и тестовый файл (test.txt). Код можно запустить из корневой папки love . test.txt   -  person Mikkel Leivsen    schedule 24.09.2015
comment
Я бы не стал полагаться на точное равенство при использовании математики FP.   -  person Bartek Banachewicz    schedule 24.09.2015
comment
Я предлагаю вам сначала проверить, пересекаются ли два сегмента, и если да, вычислить их пересечение. См. stackoverflow.com/a/3840235/107090.   -  person lhf    schedule 24.09.2015


Ответы (1)


Познакомьтесь с арифметикой с плавающей запятой: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Например

> string.format("%.32f", 1/3)
0.33333333333333331482961625624739
> 1/3 == 0.3333333
false

Так что это зависит от того, как выглядят ваши вычисления X и lp*. Вы должны использовать допуск при сравнении чисел с плавающей запятой.

> math.abs(1/3 - 0.33) == 0
false
> math.abs(1/3 - 0.33333) < 1/10^6
false
> math.abs(1/3 - 0.33333) < 1/10^5
true
person Markus    schedule 25.09.2015