为什么Math.pow(0,0)=== 1?

爱奥尼亚(IonicăBizău):

我们都知道0 0是不确定的。

但是javascript说:

Math.pow(0, 0) === 1 // true

C ++说了同样的话:

pow(0, 0) == 1 // true

为什么?

我知道:

>Math.pow(0.001, 0.001)
0.9931160484209338

但是为什么不Math.pow(0, 0)抛出错误呢?也许a NaN会比1

Shafik Yaghmour:

在C ++中 ,pow(0,0) 的结果基本上是实现定义的行为,因为在数学上我们有一个矛盾的情况,应该总是应该始终是for ,因此您在数学上也不应该对此期望任何结果。Wolfram Alpha的论坛帖子进入多一点细节。 N^010^N0N > 0

尽管pow(0,0)产生结果1对于许多应用程序都是有用的,因为涵盖IEC 60559浮点算术支持的部分中指出了国际标准(编程语言)中的C

通常,C99避开数值有用的NaN结果。[...] pow(∞,0)和pow(0,0)的结果均为1,因为有些应用程序可以利用此定义。例如,如果x(p)和y(p)是在p = a处变为零的任何解析函数,则pow(x,y)等于exp(y * log(x)),随着p接近,其逼近1一个。

更新C ++

正如leemes正确地指出我最初链接为基准复杂的版本POW不复杂的版本权利要求它是域误差草案C ++标准回落到草案C标准和两个C99C11中部分7.12.7.4 的POW功能2说(强调我的):

[...] 如果x为零且y为零,则可能会发生域错误。[...]

其中,据我可以告诉手段这种行为是不确定的行为绕组回位段7.12.1 的错误疾病的治疗说:

如果输入参数在定义数学函数的域之外,则会发生域错误。如果整数表达式math_errhandling&MATH_ERRNO为非零,则整数表达式errno获取值EDOM;[...]

因此,如果存在域错误,那么这将是实现定义的行为,但是在最新版本的gcc和中clang,值均为errno0因此对于那些编译器而言,这不是域错误

更新Javascript

对于Javascriptpow(x,y)“数学对象”部分中ECMAScript®语言规范指出:15.8 15.8.2.13

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章