Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Ruby对指数方程的变量和数字有不同的处理方式?_Ruby_Math - Fatal编程技术网

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

为什么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

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

在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.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),因此在求幂之后发生。