1

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

在 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

4 回答 4

4

它以第一行为

-(4.5 ** 0.5)

这给出了 4.5 的负平方根。第二个方程等价于

(-4.5) ** 0.5

因此复杂的答案。

于 2013-01-10T21:11:31.523 回答
3

因为运算符优先级。求幂**具有最高的精度。所以你首先提出一个正数0.5,然后否定它,而不是你期望的。然而,在第二种情况下, foo 已经-4.5如此否定优先。

于 2013-01-10T21:12:39.527 回答
2

如果您的问题不是关于优先级,而是关于为什么foo一旦分配-4.5就不能分解为-and 4.5,那么答案就太明显了。这是一个非常基本的特性,对所有类似系统的语言都是通用的,包括所有编程语言和所有自然语言,以及数学符号。一旦某个对象x被评估/计算,那么它就是一个单一的东西。您无法返回将其重新解释为多个部分。一种语言所能做的(无论是自然语言还是编程语言)都是将x其视为一个对象,然后将其与其他部分进一步连接以计算更大的含义。没有回头和分解曾经评估/计算过的东西。

在自然语言中,这称为constituency。如果一个单词序列foo bar baz被解释为[foo bar] baz,那么就不能同时返回并将其解释为foo [bar baz]

在数学中,有时 的计算值(foo bar) baz可能等于foo (bar baz),但这只是通过应用称为关联性的特殊属性,即使值可能变得相同,它们也意味着不同的东西。此外,关联性通常不成立。

于 2013-01-10T21:25:31.977 回答
0

**具有比 更高的运算符优先级-。这是您可能更熟悉的运算符的示例。

1 + 2 * 3  => 7

x = 1 + 2  => 3

x * 3      => 9
于 2013-01-10T21:23:55.713 回答