2014-10-29 2 views
1

У меня есть ситуация, когда я выполняю вычисление над огромным количеством строк, и я могу реально увеличить производительность, если я может отказаться от условного утверждения.Получите 1, 0, -1 как положительный, нулевой или отрицательный для целого числа с математической только

Что мне нужно для данного положительного, нулевого или отрицательного целого числа. Я хочу получить результат 1, 0, -1 соответственно.

Так что если я сделаю col/ABS(col), я получу 1 для положительного числа и -1 для отрицательного числа, но, конечно, если col равно 0, то я получу ошибку. Я не могу получить ошибку.

Это кажется достаточно простым, но я не могу обмотать его впереди.

+0

Хм, каково влияние умножения термина, которое у вас уже есть на 'col'? –

+0

В зависимости от языка вы можете сказать: 'if not value return 0; else return value/abs (value) '. – fedorqui

+1

'col/max (1, abs (col))'? Уродливый, но работает. (Для целых чисел, то есть.) – biziclop

ответ

2

col/max(1, abs(col))

Гадкий но работает. Для целых чисел, то есть. Для значений с плавающей запятой, где нет четко определенного наименьшего положительного значения, вы застреваете, если язык не позволяет вам рассматривать его как последовательность бит, тогда вы можете просто сделать то же самое со знаком знака и значащим.

ли это помогает оптимизировать что-либо весьма спорно, хотя. Это, конечно, усложняет чтение.

+0

Спасибо, это работает. Я проверю вас, как только смогу. В моей заявке IF заявления выгружаются на другой движок. Я не знаю, поможет ли Макс или нет, но это то, что я искал. –

+3

, но max - всего лишь оболочка оператора if ...это не имеет для меня никакого смысла –

+0

@TMcKeown Да, поэтому для меня это немного подозрительно. Но, как говорит OP, если на работе есть два разных движка, быстрый, который имеет «max()» жестко закодированный в нем и медленный, который обрабатывает операторы if if (что-то вроде SQL и PLSQL), и он избегает контекст-коммутация, он может просто работать. – biziclop

5

Предполагая, либо два с дополнением 32-битовые целые числа, или дополнение до без отрицательных нуля беспокоиться, то следующие работы хорошо:

(x>>31) - (-x>>31); 

Заменить 31 с 63 для 64-разрядных целых чисел, и так на.

+0

Это умно, так как знак будет на последнем бите. Я не могу использовать это, но это хороший ответ. –

+1

Не так ли? Для положительного целого вы получите '0 - 1'? – beaker

+0

@beaker no, вы получите '0 - -1', что равно' 1'. –

0

Я делаю это в табличной модели SSAS, которая не имеет функции MAX, как в ответе @ bizclop (что помогает во многих других приложениях, таких как EXCEL).

я в конечном итоге делает следующее, который был вдохновлен принятый ответ:

ROUND([col]/(ABS([col]) + 1), 0) 

Это кончался уменьшая мое время запроса довольно значительно (40%) по сравнению с IF([col] <> 0, [col]/ABS([col], 0).

Смежные вопросы