运算符优先级'pow'和'root'

时间:2010-08-12 11:54:36

标签: algorithm

我正在为整数编写一个小的自制计算器,它包括两个二元运算符,'pow'和'root'。 'pow'运算符计算(左操作数)^(右操作数),'root'运算符找到最大数n,使得n ^(左操作数)< =(右操作数)。

假设这不是一件荒谬的事情,这些算子的优先级应该是什么?目前我有相同的优先级,所以像

这样的字符串
3 root 1500 pow 7

从左到右评估。这是正确的吗?我应该把这个问题放在mathoverflow上吗?

4 个答案:

答案 0 :(得分:4)

powroot本质上是相同的操作,表达方式不同(类似于二进制+和 - )。即,sqrt(a)pow(a, 0.5)相同,就像a + ba - (-b)相同。所以我会说他们应该有相同的优先权,因此从左到右进行评估。

答案 1 :(得分:3)

在大多数其他语言中,取幂从右到左。这是因为(a ^ b)^ c = a ^(b * c)!= a ^(b ^ c)。例如,参见Python(第5.4节)

中关于幂运算符的部分

答案 2 :(得分:1)

pow和root在数学上具有相同的优先级,您可以看到here

标准操作顺序,或 优先权,表示在 以下图表。

  • 指数和根
  • 乘法和除法
  • 加法和减法

正如其他人所说

3 root 1500 = 1500 pow (1/3)

因此它们是反函数。反函数具有相同的优先级。

你的操作数的顺序也很不寻常。我更喜欢1500根3是最大的整数< =立方根1500。

答案 3 :(得分:1)

在这种特殊情况下,优先级似乎很好 - 你会遇到关联性问题,在某些情况下它可以作为优先级等效。原因是你做了args to root reverse而不是pow我们倾向于把它视为一个“自然”的命令 - left arg受到右边arg的操作,你的root实际上只是1 / y的pow。

所以,你可能需要尝试一些更复杂的表达式,例如A root B root C pow D root G等等。如果你按照与pow相同的顺序保留root的args,它会好得多。