【问题标题】:Get 1, 0, -1 as positive, zero, or negative for an integer with math only仅用数学计算整数的 1、0、-1 作为正数、零或负数
【发布时间】:2014-10-29 16:05:09
【问题描述】:

我有一种情况,我正在对大量行执行计算,如果我可以避免使用条件语句,我真的可以提高性能。

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

因此,如果我执行col/ABS(col),我将得到 1 表示正数,而 -1 表示负数,但当然如果 col 等于 0,那么我会得到一个错误。我不能得到错误。

这看起来很简单,但我无法绕开它。

【问题讨论】:

  • 嗯,将您已有的术语乘以 col 有什么影响?
  • 根据语言,您可以说:if not value return 0; else return value/abs(value)
  • col/max(1, abs(col))?丑陋但有效。 (对于整数,就是这样。)
  • 我认为关键是要避免另一个条件 - 这两个语句都意味着另一个条件。
  • 这里有一些灵感,也许:stackoverflow.com/questions/1610836/…

标签: algorithm


【解决方案1】:

假设二进制补码是 32 位整数,或者没有负零需要担心的一个补码,那么以下方法效果很好:

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

对于 64 位整数,将 31 替换为 63,依此类推。

【讨论】:

  • 这很聪明,因为符号将在最后一位。我不能用这个,但这是一个很好的答案。
  • 这不是倒退吗?对于一个正整数,你会得到0 - 1?
  • @beaker 不,你会得到0 - -1,即1
  • 啊,算术移位与逻辑移位。是的,我现在看到你的算术移位是正确的。
【解决方案2】:

col/max(1, abs(col))

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

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

【讨论】:

  • 谢谢,这行得通。我会尽快检查你。在我的应用程序中,IF 语句被卸载到不同的引擎。我不知道 Max 是否会提供帮助,但这正是我想要的。
  • 但 max 只是 if 语句的包装......这对我来说没有多大意义
  • @TMcKeown 是的,这就是为什么它对我来说有点可疑。但正如 OP 所说,如果有两个不同的引擎在工作,一个快速的引擎将 max() 硬编码到其中,一个慢速的引擎处理 if 语句(类似于 SQL 和 PLSQL),它会避免上下文 -切换,它可能只是工作。
  • absmax 可以以无分支方式编码,但是你真的需要定义这样,我想不出无分支 @ 987654326@ 不使用无分支双向sign,所以一旦你沿着那条路线走,你就快到一半了。
【解决方案3】:

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

在接受的答案的启发下,我最终做了以下事情:

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

IF([col] <> 0, [col]/ABS([col], 0) 相比,这最终显着减少了我的查询时间 (40%)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多