Language agnostic -1的计算能力
实现Language agnostic -1的计算能力,language-agnostic,Language Agnostic,实现(-1)^n*a,是否有既定的习惯用法 显然,选择pow(-1,n)*a似乎是浪费,(1-2*(n%2))*a也很难看,效率也不高(两次乘法和一次加法,而不仅仅是设置符号)。我想我会选择n%2-答:目前来说是一个,但引入条件语句似乎也有点可疑。正如其他人所写,在大多数情况下,可读性比性能更重要,编译器、解释器和库在优化方面比大多数人想象的更好。因此,pow(-1,n)*a在您的平台上可能是一个有效的解决方案 如果您确实存在性能问题,您自己的建议是什么-a:a可以。我看不出有什么理由担心有条件
(-1)^n*a
,是否有既定的习惯用法
显然,选择
pow(-1,n)*a
似乎是浪费,(1-2*(n%2))*a
也很难看,效率也不高(两次乘法和一次加法,而不仅仅是设置符号)。我想我会选择n%2-答:目前来说是一个
,但引入条件语句似乎也有点可疑。正如其他人所写,在大多数情况下,可读性比性能更重要,编译器、解释器和库在优化方面比大多数人想象的更好。因此,pow(-1,n)*a在您的平台上可能是一个有效的解决方案
如果您确实存在性能问题,您自己的建议是什么-a:a
可以。我看不出有什么理由担心有条件的分配
如果您的语言有位AND运算符,您也可以使用
n&1-a:a
即使没有任何优化,也应该非常有效。在许多平台上,这可能是pow(a,b)
在a==-1
和b
为整数的特殊情况下实际做的事情。对编程语言、编译器和CPU做出某些假设
为了重复传统的——正确的——智慧,甚至不要考虑优化这类事情,除非您的分析工具说这是一个瓶颈。如果是这样,n%2-答:a
可能会生成非常高效的代码;即一个和
,一个针对零的测试,一个否定,以及一个条件移动,和+测试和否定独立,因此它们可能同时执行
另一个选项如下所示:
zero_or_minus_one = (n << 31) >> 31;
return (a ^ zero_or_minus_one) - zero_or_minus_one;
zero\u或_-one=(n>31;
返回(a^zero\u或_减_-one)-zero\u或_减_-one;
这假设32位整数、算术右移、定义的整数溢出行为、两位补码表示等。它可能还会编译成四条指令(左移、右移、XOR
和减法),每个指令之间都有一个依赖关系…但对于某些指令集,它可能更好;例如,如果您使用SSE指令对代码进行矢量化
顺便说一句,如果你用一种特定的语言来标记你的问题,那么你的问题会得到更多的视图,可能会得到更多有用的答案。如果这是语言不可知的,为什么你要使用特定的语法?可能存在一种能有效处理(-1)^n*a
的语言。我会选择pow(-1,n)*答:这是读者最容易理解的。很难说,因为你说的不是一种特定的语言,但有一个很好的机会pow()已经做了一些优化/特殊情况。例如,查找C实现,它可能与您预期的完全不同。将此问题标记为语言不可知的要点是,语言通常同意它们提供的功能,请参见,例如atan2
或2我非常相信编译器将首先将n%2
转换为n&1
。对pow(-1,n)
信心不足-非整数n的行为不同。