为什么Ruby对指数方程的变量和数字有不同的处理方式?
当使用负数作为基数执行指数计算时,当使用原始值而不是包含该值的变量时,将返回不一致的结果 在IRB中:为什么Ruby对指数方程的变量和数字有不同的处理方式?,ruby,math,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
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.5 ** 0.5)
它给出了4.5的负平方根。
第二个等式等价于
(-4.5) ** 0.5
这就是复杂的答案。它以第一行为准
-(4.5 ** 0.5)
它给出了4.5的负平方根。
第二个等式等价于
(-4.5) ** 0.5
因此得到了复杂的答案。因为运算符优先级。求幂法的精度最高。因此,您首先将一个正数提升到
0.5
,然后将其取反,而不是您所期望的值。然而,在第二种情况下,foo已经是-4.5
,因此否定优先 因为运算符优先级。求幂法的精度最高。因此,您首先将一个正数提升到0.5
,然后将其取反,而不是您所期望的值。然而,在第二种情况下,foo已经是-4.5
,因此否定优先 **
的运算符优先级高于-
。下面是一个您可能更熟悉的操作员示例
1 + 2 * 3 => 7
x = 1 + 2 => 3
x * 3 => 9
**
的运算符优先级高于-
。下面是一个您可能更熟悉的操作员示例
1 + 2 * 3 => 7
x = 1 + 2 => 3
x * 3 => 9
如果你的问题不是关于优先顺序,而是关于为什么曾经分配给
-4.5
的foo
不能分解为-
和4.5
,那么答案太明显了。这是一个非常基本的特性,对于所有类似语言的系统都是通用的,包括所有编程语言和所有自然语言,以及数学符号。一旦某个对象x
被评估/计算,那么它就是一个单一的东西。您不能返回将其重新解释为多个部分。一种语言所能做的(无论是自然语言还是编程语言)就是将x
作为一个对象,并将其与其他部分进一步连接,以计算更大的含义。没有回头去分解曾经被评估/计算过的东西
在自然语言中,这被称为选区。如果一系列单词foo-bar-baz
被解释为[foo-bar]baz
,那么就不能返回并同时解释为foo[bar-baz]
在数学中,有时
(foo-bar)baz
的计算值可能等于foo(bar-baz)
,但这只是通过应用一种称为关联性的特殊属性来实现的,即使该值可能变为相同,但它们的含义不同。此外,关联性一般不成立。如果你的问题不是关于优先权,而是关于为什么foo
一旦被赋值-4.5
就不能分解为-
和4.5
,那么答案就太明显了。这是一个非常基本的特性,对于所有类似语言的系统都是通用的,包括所有编程语言和所有自然语言,以及数学符号。一旦某个对象x
被评估/计算,那么它就是一个单一的东西。您不能返回将其重新解释为多个部分。一种语言所能做的(无论是自然语言还是编程语言)就是将x
作为一个对象,并将其与其他部分进一步连接,以计算更大的含义。没有回头去分解曾经被评估/计算过的东西
在自然语言中,这被称为选区。如果一系列单词foo-bar-baz
被解释为[foo-bar]baz
,那么就不能返回并同时解释为foo[bar-baz]
在数学中,有时
(foo-bar)baz
的计算值可能等于foo(bar-baz)
,但这只是通过应用一种称为关联性的特殊属性来实现的,即使该值可能变为相同,但它们的含义不同。此外,关联性一般不成立。我知道它在做什么,但为什么?找不到实际的核心文档。这来自实用程序员指南:关于求反之前求幂的逻辑,我想说求反被认为是乘法(乘-1),因此在求幂之后发生。我理解它在做什么,但为什么?找不到实际的核心文档。这来自于实用程序员指南:关于求反之前求幂的逻辑,我想说的是,求反被认为是乘法(乘-1),因此在求幂之后发生。