Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
Javascript 在Math.pow(x,0)不是1的地方有没有'x'值?_Javascript_Node.js - Fatal编程技术网

Javascript 在Math.pow(x,0)不是1的地方有没有'x'值?

Javascript 在Math.pow(x,0)不是1的地方有没有'x'值?,javascript,node.js,Javascript,Node.js,我在一个例子中发现,Math.pow(0,0)==1返回true 在中,我们可以找到x^y的以下规则: 如果y为NaN,则结果为NaN 如果y为+0,则结果为1,即使x为NaN 如果y是−0,结果为1,即使x为NaN 如果x为NaN,y为非零,则结果为NaN 如果abs(x)>1且y为+∞, 结果是+∞. 如果abs(x)>1且y为−∞, 结果是+0 如果abs(x)==1且y为+∞, 结果是NaN 如果abs(x)==1且y为−∞, 结果是NaN 如果abs(x)0和y不是奇数整数,则结果为

我在一个例子中发现,
Math.pow(0,0)==1
返回
true

在中,我们可以找到
x^y
的以下规则:

  • 如果y为NaN,则结果为NaN
  • 如果y为+0,则结果为1,即使x为NaN
  • 如果y是−0,结果为1,即使x为NaN
  • 如果x为NaN,y为非零,则结果为NaN
  • 如果abs(x)>1且y为+∞, 结果是+∞.
  • 如果abs(x)>1且y为−∞, 结果是+0
  • 如果abs(x)==1且y为+∞, 结果是NaN
  • 如果abs(x)==1且y为−∞, 结果是NaN
  • 如果abs(x)0和y不是奇数整数,则结果为+∞.
  • 如果x是−∞ y0和y不是奇数整数,结果是+0

  • 如果x是−0和y您从文档中复制/粘贴的内容包括以下要求:

    • 如果y为+0,则结果为1,即使x为NaN

    因此,您的问题的答案似乎是“不”

    不,在任何情况下都不会运行结果。缔约国指出:

    • 如果y为NaN,则结果为NaN
    • 如果y为+0,则结果为1,即使x为NaN
    • 如果y为-0,则结果为1,即使x为NaN
    所有参数在运行之前都被强制为数值类型,因此无论它是什么,都将是1。如果有多个结果适用,则适用的第一个结果是返回的结果,在本例中为
    1

    正如您所说,y是0,因此它不是NaN,因此不会返回NaN

    ES5:

    以下每个数学对象函数都将ToNumber abstract运算符应用于其每个参数(如果有多个参数,则按从左到右的顺序),然后对结果数值执行计算


    任何不是数字(或满足数字格式的字符串)的参数都将被强制为0(对于
    null
    false
    )、1(对于
    true
    )或NaN(任何其他)。根据ES5规范,算法的前三个步骤如下所示:

    • 如果y为NaN,则结果为NaN
    • 如果y为+0,则结果为1,即使x为NaN
    • 如果y是−0,结果为1,即使x为NaN
    如果您正在编写ES5标准的实现,您的代码可能如下所示:

    function pow(x, y) {
        if (isNaN(y)) return NaN;
        if (y === 0) return 1;
        // ... follow the other rules
    }
    

    y==0
    正确时,
    x
    的任何值都不会导致它返回除
    1
    以外的任何值,因为您使用的是运行V8的node.js,所以让我们看一下

    函数
    Math.pow
    在和状态中定义:

    function MathPow(x, y) {
      return %_MathPow(TO_NUMBER_INLINE(x), TO_NUMBER_INLINE(y));
    }
    
    宏用于将任何类型转换为数值。因此,在
    \u MathPow
    操作中,我们将数字作为参数

    让我们前进到,它实现了中引用
    HPower
    指令的
    MathPow
    调用。后者使用
    power\u helper(c\u left->DoubleValue(),c\u right->DoubleValue())计算功率。
    :中定义的方法。这里我们终于有了计算的逻辑:

    double power_helper(double x, double y) {
      int y_int = static_cast<int>(y);
      if (y == y_int) {
        return power_double_int(x, y_int);  // Returns 1 if exponent is 0.
      }
    
      // ...
    }
    

    从上面可以看出,
    n
    将始终是
    0
    ,因此
    循环将永远不会运行,返回
    p=1
    不变。

    只有一个问题:为什么需要它?@VisioN满足我的好奇心。。。?也许吧。从数学上讲,零是唯一的x,它的
    xpow0
    不是0,而是未定义的。不是JavaScript
    undefined
    ,它只是一个数学规则,表示
    0pow0
    中没有逻辑,因此它是一个未定义的结果。它可能是任何东西,也可能什么都不是。阅读以下内容:您所指出的文档是否清楚地提到,对于y=0或y=-0,无论怎样,结果都是1@イオニカ ビザウ 我没有说JavaScript的
    Math.pow的结果是什么,我只是说明了它背后的数学原理。对不起,你不理解这个问题
    Math.pow(NaN,0)
    是1。我的问题是,如果我们有一个值,表示什么
    Math.pow(ourValue,0)
    不是1@イオニカビザウ: 我理解你刚才所说的问题。我的答案是不,永远不会是这样。源代码是从哪里提取的?这似乎是正确的答案!我说“如果你在写一个实现……你的代码可能看起来像这样”。这不是来自JS引擎的真实代码@イオニカビザウ: 您对具体实现代码的需求是什么?所有浏览器都被指定为遵循ECMAScript语言规范中给出的不变量,
    Math.pow()
    的所有主要实现的行为与指定的方式没有任何不同。如果您想要实现特定的代码,那么您的问题根本没有明确说明这一点,并且对于它的含义相当混乱。这是否意味着对于任何x,结果都是1?我不相信它们会威胁到非数字值…“下面的每个数学对象函数都会将ToNumber抽象运算符应用于其每个参数”…
    如果y为+0,则结果为1
    对meThis来说似乎非常明确这是正确的答案!请从
    power\u double\u int
    函数中发布代码,因为这会给出答案<代码>无符号n=(y<0)-y:y
    n
    设置
    0
    值,接下来有两行
    ,而(n!=0){/*do something*/}返回p其中
    p
    用值
    1
    初始化。因此,对于
    y===0
    ,此函数返回
    1
    。好!!
    double power_helper(double x, double y) {
      int y_int = static_cast<int>(y);
      if (y == y_int) {
        return power_double_int(x, y_int);  // Returns 1 if exponent is 0.
      }
    
      // ...
    }
    
    double power_double_int(double x, int y) {
      double m = (y < 0) ? 1 / x : x;
      unsigned n = (y < 0) ? -y : y;
      double p = 1;
      while (n != 0) {
        if ((n & 1) != 0) p *= m;
        m *= m;
        if ((n & 2) != 0) p *= m;
        m *= m;
        n >>= 2;
      }
      return p;
    }