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
正如您所说,y是0,因此它不是NaN,因此不会返回NaN ES5: 以下每个数学对象函数都将ToNumber abstract运算符应用于其每个参数(如果有多个参数,则按从左到右的顺序),然后对结果数值执行计算1
任何不是数字(或满足数字格式的字符串)的参数都将被强制为0(对于
、null
和false
)、1(对于”
)或NaN(任何其他)。根据ES5规范,算法的前三个步骤如下所示:true
- 如果y为NaN,则结果为NaN
- 如果y为+0,则结果为1,即使x为NaN
- 如果y是−0,结果为1,即使x为NaN
function pow(x, y) { if (isNaN(y)) return NaN; if (y === 0) return 1; // ... follow the other rules }
当
正确时,y==0
的任何值都不会导致它返回除x
以外的任何值,因为您使用的是运行V8的node.js,所以让我们看一下 函数1
在和状态中定义: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
而
循环将永远不会运行,返回
不变。只有一个问题:为什么需要它?@VisioN满足我的好奇心。。。?也许吧。从数学上讲,零是唯一的x,它的p=1
不是0,而是未定义的。不是JavaScriptxpow0
,它只是一个数学规则,表示undefined
中没有逻辑,因此它是一个未定义的结果。它可能是任何东西,也可能什么都不是。阅读以下内容:您所指出的文档是否清楚地提到,对于y=0或y=-0,无论怎样,结果都是1@イオニカ ビザウ 我没有说JavaScript的0pow0
为Math.pow的结果是什么,我只是说明了它背后的数学原理。对不起,你不理解这个问题
是1。我的问题是,如果我们有一个值,表示什么Math.pow(NaN,0)
不是1@イオニカビザウ: 我理解你刚才所说的问题。我的答案是不,永远不会是这样。源代码是从哪里提取的?这似乎是正确的答案!我说“如果你在写一个实现……你的代码可能看起来像这样”。这不是来自JS引擎的真实代码@イオニカビザウ: 您对具体实现代码的需求是什么?所有浏览器都被指定为遵循ECMAScript语言规范中给出的不变量,Math.pow(ourValue,0)
的所有主要实现的行为与指定的方式没有任何不同。如果您想要实现特定的代码,那么您的问题根本没有明确说明这一点,并且对于它的含义相当混乱。这是否意味着对于任何x,结果都是1?我不相信它们会威胁到非数字值…“下面的每个数学对象函数都会将ToNumber抽象运算符应用于其每个参数”…Math.pow()
对meThis来说似乎非常明确这是正确的答案!请从如果y为+0,则结果为1
函数中发布代码,因为这会给出答案<代码>无符号n=(y<0)-y:ypower\u double\u int
设置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; }