对于仅包含数学的整数,获得1,0,-1为正,零或负

时间:2014-10-29 16:05:09

标签: algorithm

我遇到的情况是我在大量行上进行计算,如果能避开条件语句,我可以真正提高性能。

我需要的是给定的正,零或负整数我想分别得到结果1,0,-1。

所以,如果我col/ABS(col),我会得到1为正数,-1为负数,但当然如果col等于0,那么我将得到一个错误。我不能得到错误。

这看起来很简单,但我不能把它放在前面。

3 个答案:

答案 0 :(得分:5)

假设有两个补码的32位整数,或者一个补码而没有负零担心,那么以下方法效果很好:

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

31替换为63以获取64位整数,依此类推。

答案 1 :(得分:2)

col/max(1, abs(col))

丑陋但有效。对于整数,就是这样。对于没有明确定义的最小正值的浮点值,除非语言允许您将其视为位序列,否则您将卡住,然后您可以对符号标记执行相同操作有意义的。

这是否有助于优化任何事情,这是值得商榷的。这肯定会让事情变得更难阅读。

答案 2 :(得分:0)

我在SSAS表格模型中执行此操作,该模型没有像@ bizclop的答案那样具有MAX功能(这有助于许多其他应用程序,例如EXCEL)。

我最终做了以下内容,其灵感来自于接受的答案:

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

这最终使我的查询时间显着缩短(40%)而不是IF([col] <> 0, [col]/ABS([col], 0)