当使用负数作为基数进行指数计算时,使用原始值而不是包含该值的变量时会返回不一致的结果。
在IRB:
1.9.3p194 :001 > -4.5 ** 0.5
=> -2.1213203435596424
1.9.3p194 :002 > foo = -4.5
=> -4.5
1.9.3p194 :003 > foo ** 0.5
=> (1.2989340843532398e-16+2.1213203435596424i)
1.9.3p194 :004 > (-4.5) ** 0.5
=> (1.2989340843532398e-16+2.1213203435596424i)
是什么给出的?显然,编译器将-4.5 ** 0.5
解释为-(4.5 ** 0.5)
,但为什么使用变量时的行为不同?
答案 0 :(得分:4)
将第一行视为
-(4.5 ** 0.5)
给出负平方根4.5。 第二个等式相当于
(-4.5) ** 0.5
因此复杂的答案。
答案 1 :(得分:3)
由于运营商优先权。指数**
具有最高的前瞻性。因此,您首先将正数提高到0.5
然后否定它而不是您期望的数字。然而,在第二种情况下,foo已经-4.5
,因此否定优先。
答案 2 :(得分:2)
如果您的问题不是优先级,而是为什么foo
曾被分配-4.5
无法分解为-
和4.5
,那么答案就太明显了。这是一个非常基本的功能,对所有语言系统都是通用的,包括所有编程语言和所有自然语言,以及数学符号。一旦评估/计算了某个对象x
,那么它就是一件事。你不能回去把它重新解释为多个部分。所有语言都可以(无论是自然的还是编程的)将x
作为单个对象,并进一步将其与其他部分连接起来以计算更大的含义。没有回头并且分解曾经被评估/计算过的东西。
在自然语言中,这称为选区。如果一系列单词foo bar baz
被解释为[foo bar] baz
,则无法返回并同时将其解释为foo [bar baz]
。
在数学中,有时(foo bar) baz
的计算值可能等于foo (bar baz)
,但这只是通过应用一个名为 associativity 的特殊属性,即使值可能变得一样,他们意味着不同的东西。而且,关联性一般不成立。
答案 3 :(得分:0)
**
运算符优先级高于-
。以下是您可能更熟悉的操作员示例。
1 + 2 * 3 => 7
x = 1 + 2 => 3
x * 3 => 9