Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic -1的计算能力_Language Agnostic - Fatal编程技术网

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的行为不同。