- 1
- 2
// Number a, Number b
return new Double(a.doubleValue() - numericTolerance).compareTo(b.doubleValue()) < 0
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+79
// Number a, Number b
return new Double(a.doubleValue() - numericTolerance).compareTo(b.doubleValue()) < 0
В продолжение #16698, после рефакторинга. Видимо, диагноз: ООП головного мозга.
3.14159265 17.09.2014 01:37 # 0
А так равные числа будут одно меньше другого при положительном numericTolerance.
Actine 17.09.2014 01:44 # 0
Разность чисел по модулю это для equals, а у меня отдельные ситуации на less than / more than. Бэкграунд таков, что написал свой expression language для тестирования нашего продукта, в котором есть функциональность а-ля онлайн экселя.
3.14159265 17.09.2014 01:45 # 0
b=1.0d
eps=0.00000001d
lessThan(a,b)=true
Кстати подобный же хинт дал Dummy00001 в предыдущем треде.
Actine 17.09.2014 01:52 # 0
Хотя в принципе ты прав, в таком случае вообще возникает неопределенность.
3.14159265 17.09.2014 02:10 # 0
return (Math.abs(a-b)<eps) ? 0 : Double.compare(a,b); //checks +0.0, -0.0 and NaNs
Actine 17.09.2014 02:43 # +1
Твой единый компаратор при a=0.99, b=1, eps=0.02 вернул бы 0, т.е. equals
Мне надо, чтобы для этих чисел все три условия "a > b", "b > a" и "a == b" возвращали… true. Такая вот специфика. Поэтому отдельные функции, которые по-разному учитывают эпсилон — в сторону меньше, в сторону больше, или же абсолютно.
Эпсилон в моей либе — не максимальная разность, при которой числа считаются равными, а максимальная разность, при которой условие должно считаться выполненным.
1024-- 17.09.2014 08:27 # +2
Читается как математический ад.
bormand 17.09.2014 08:41 # +3
Да почему. Просто читай их как:
1024-- 17.09.2014 08:54 # 0
bormand 17.09.2014 09:54 # 0
Крестовый boost::tribool тут пришелся бы к месту.
P.S. Правда тогда == будет возвращать либо false либо х.з. Ничто не истинно...
3.14159265 18.09.2014 13:51 # 0
Boolean = true, false, null
Или свой енум.
gost 17.09.2014 09:32 # 0
(a > b) == true
(a < b) == true
(a == b) == true
roman-kashitsyn 17.09.2014 10:28 # +2
Поэтому компаратор может начать выдавать странные результаты, если, например, случайно отсортировать им список.
Так что, кмк, правильней сделать статическую функцию с длинным говорящим названием в стиле objC, вроде equalWithinEpsilon, чтобы пореже возникало желание ей пользоваться.
3.14159265 17.09.2014 11:36 # +1
Потому кмк правильней будет желание пореже им пользоваться.