Пятничная задчка - для настоящих математиков!

Глупый телевизор
Дата: 18.03.2011 23:03:11
Сидел я сегодня вечерком попивал пивко возле Родины Матери, смотрел на мирно текущий Днепр и ясное небо, дышал свежим киевски воздухом и чего-то так меня потянуло на ностальгию... вспомнил я универ и трехтомник Кнута. В нем были задачки по пятибальной системе, и вспомнилась мне одна трехбальная.

Формулируется примерно так: без операторов сравнения найти максимальное между двух чисел.
Переводя на Оракл сформулирую так: С помощью операторов +,-,*,/ и функции mod найти максимальное. Кто найдет без функции мод - вообще гениальный парень. Победитель определяется в зависимости от длины выражения.

Данные для проверки:
select a, b, greatest(a,b) c
from
(
select 5 a, 7 b from dual
union all select 7 a, 5 b from dual
union all select 6 a, 6 b from dual
union all select -5 a, -7 b from dual
union all select -7 a, -5 b from dual
union all select 7 a, -5 b from dual
union all select -5 a, 7 b from dual
union all select -7 a, 5 b from dual
union all select 5 a, -7 b from dual
union all select 1 a, 0 b from dual
union all select 0 a, 1 b from dual
union all select 0 a, -1 b from dual
union all select -1 a, 0 b from dual
union all select 0 a, 0 b from dual
)

Вы спросите: хлопчина, а при чем здесь вообще Оракл. Отвечу: можно было б разместить и в форуме мелкософта и дельфийского, но там не такие интересные ребята и вообще с ними ни накала страстей ни интеллектуального срача.

Трехтомник кнута я сходу не нашел, но надо будет подыскать пятибальную задачку и навернуть на нее специфику Оракла.

Искренне ваш
Глупый Телевизор
comphead
Дата: 18.03.2011 23:27:53
Глупый телевизор,

да че то уже расслабились... а не холодно то сегодня под клепаной мамой пиво пить, коллега? :)
Андрей Панфилов
Дата: 19.03.2011 00:06:39
Глупый телевизор,

лучше бы вместо mod оставили bitand или abs, умножение на 2 нужно только чтобы деление на 0 не получить

(a + b
        + (a - b)
          * (1
             - 2
               * ( (2 * (a - b) - MOD ( (2 * (a - b)), (2 * (a - b) + 1)))
                  / (2 * (a - b) + 1))))
       / 2
Андрей Панфилов
Дата: 19.03.2011 00:09:24
хотя 2ка тоже не рулит...
+
       (a + b
        + (a - b)
          * (1
             - 2
               * ( (3 * (a - b) - MOD ( (3 * (a - b)), (3 * (a - b) + 1)))
                  / (3 * (a - b) + 1))))
       / 2
_Nikotin
Дата: 19.03.2011 00:12:28
Глупый телевизор,

Какие ограничения на a и b ? Целые? Диапазон?
-2-
Дата: 19.03.2011 00:25:36
unpivot/odcinumberlist+max
Глупый Телевизор
Дата: 19.03.2011 00:39:52
comphead
а не холодно то сегодня под клепаной мамой пиво пить, коллега? :)
Более чем шикарно!
Андрей Панфилов
лучше бы вместо mod оставили bitand или abs
abs - не интересно. Потому как это по сути сравнение только с нулем. Так же как и функция sign - сравнение с нулем. А вот с bitand - действительно интересно. Об этом я не подумал.
Интересен тот момент чтоб даже на низком уровне избавится от сравнений. То есть если перевести выражение на ассемблер - то чтоб не было команды cmp.
По поводу Ваших решений. Первое неправильное на приведенных данных, а второе правильное, и что самое ужасное - короче моего. Так что надо что-то мне теперь додумывать...
_Nikotin
Какие ограничения на a и b ? Целые? Диапазон?
Ну, например... Действительные. -1010..1010.
Глупый Телевизор
Дата: 19.03.2011 00:49:57
-2-
unpivot
Ну ну... а если строк 123 мильона?
-2-
max
Глупый Телевизор
С помощью операторов +,-,*,/ и функции mod найти максимальное. Кто найдет без функции мод - вообще гениальный парень
Да и вообще... max подразумевает собой сравнение, а от него то и хотел избавится старина Кнут в этой задачке.
-2-
Дата: 19.03.2011 01:13:01
Глупый Телевизор
То есть если перевести выражение на ассемблер - то чтоб не было команды cmp
Может лучше ограничить условный переход, по сути все операции выставляют знак, 0 и переполнение.
Андрей Панфилов
Дата: 19.03.2011 01:34:28
Глупый Телевизор
А вот с bitand
оно гораздо проще еще...

( (a + b)
        + (a - b)
          * (1 - 2 * BITAND ( (a - b), 31525197391593472) / 31525197391593472))
       / 2