为什么Ruby对指数方程式处理变量和数字的方式不同?

时间:2013-01-10 21:09:52

标签: ruby math

当使用负数作为基数进行指数计算时,使用原始值而不是包含该值的变量时会返回不一致的结果。

在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),但为什么使用变量时的行为不同?

4 个答案:

答案 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