指数运算符 ^ 和 Math.pow() 之间的区别

Posted

技术标签:

【中文标题】指数运算符 ^ 和 Math.pow() 之间的区别【英文标题】:Difference between Exponent operator ^ and Math.pow() 【发布时间】:2018-07-26 14:11:01 【问题描述】:

有什么区别:

100 ^ 49; // = 85

Math.pow(100, 49); // = 1e+98

javascript 返回不同的结果,我不知道为什么。

【问题讨论】:

指数运算符是**100**49 【参考方案1】:

^ 不是 JavaScript 中的求幂运算符,** 是(而且只是最近)。 ^ 是按位异或。更多关于 JavaScript 操作符on MDN.

如果比较100**49Math.pow(100,49),按照规范,应该没有区别;来自Math.pow

    返回使用 12.6.4 中指定的 baseexponent 应用 ** 运算符的结果。

不过,目前的实现可能是这样,也可能不是,因为求幂运算符还是很新的。例如,在我写这篇文章的时候,Chrome 的 V8 JavaScript 引擎为 100**49Math.pow(100,49) 返回非常略有不同的结果:(编辑:截至 2020 年 8 月 26 日,他们有结果相同。)

console.log(100**49);
console.log(Math.pow(100,49));

据推测,随着实施的成熟,​​差异将得到解决。 this issue 似乎涵盖了差异。 100*49 似乎是在编译时评估的(因为两个值都是常量),而 Math.pow 当然是在运行时评估的,显然算法并不相同。

如果您使用变量,**Math.pow 同意:

let a = 100;
console.log(a**49);
console.log(Math.pow(a,49));
console.log(a**49 === Math.pow(a, 49));

在 Firefox 和 Edge 上,这些值是相同的(即使是常量)。

【讨论】:

以上是关于指数运算符 ^ 和 Math.pow() 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中计算N次方的方法**和math.pow()-讲解

JavaScript技巧

为啥 numpy.power 为小指数返回 0 而 math.pow 返回正确答案?

如何在不使用 java 的 math.pow 的情况下获得指数

JavaScript表示x的y次幂

你如何在 C# 中做 *integer* 幂运算?