我们都知道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
。
在C ++中 ,pow(0,0) 的结果基本上是实现定义的行为,因为在数学上我们有一个矛盾的情况,应该总是但应该始终是for ,因此您在数学上也不应该对此期望任何结果。这Wolfram Alpha的论坛帖子进入多一点细节。 N^0
1
0^N
0
N > 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标准和两个C99和C11中部分7.12.7.4
的POW功能段2说(强调我的):
[...] 如果x为零且y为零,则可能会发生域错误。[...]
其中,据我可以告诉手段这种行为是不确定的行为绕组回位段7.12.1
的错误疾病的治疗说:
如果输入参数在定义数学函数的域之外,则会发生域错误。如果整数表达式math_errhandling&MATH_ERRNO为非零,则整数表达式errno获取值EDOM;[...]
因此,如果存在域错误,那么这将是实现定义的行为,但是在最新版本的gcc
和中clang
,值均为errno
,0
因此对于那些编译器而言,这不是域错误。
更新Javascript
对于Javascript,pow(x,y)下“数学对象”部分中的ECMAScript®语言规范指出:15.8
15.8.2.13
如果y为+0,则即使x为NaN,结果也为1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句