Math.pow(0.0, 0.0) 返回值为1;是否应该返回未定义或错误?

5
在Java中,
Math.pow(0.0, 0.0)
的返回值为1,这是错误的。0^0是未定义的。Windows计算器也存在相同的问题(我使用的是Win7)。为什么会这样呢?
Mathematica将其声明为错误,我的卡西欧科学计算器也是如此,为什么Java或Win计算器没有?这是一个bug吗?
5个回答

8

5

因为这正是Javadocs所说的:

public static double pow(double a, double b)

返回第一个参数的值提高到第二个参数的幂。 特殊情况:
* 如果第二个参数为正或负零,则结果为1.0。


4

这是一个bug吗?

不,bug指的是违反规范的东西。规范中规定:

返回第一个参数的值乘以第二个参数的幂次方。特殊情况:

  • 如果第二个参数为正数或负数零,则结果为1.0。

最后,在数学上,有些人定义 0^01。事实上,Knuth 说道 它必须是 1

从空集到空集的映射数量是 0^0。它必须是 1

他的推理如下。如果你有两个集合AB,从AB的函数数量为|B|^|A|。从空集到空集有多少个函数呢?嗯,恰好只有一个。按照这种逻辑,0^0应该是1

2

Java的定义就是这样。这就是你能说的全部。

然而,在数学上,它确实是一个未定义的量。一种看待这个问题的方法是写成:

x = 0 ^ 0

这里我用^表示指数。取对数,

log x = 0 log 0

我这样做是因为每个数学家都承认log 0是未定义的,因此可以得出log x和x也是未定义的结论。(在数学上,这被称为奇点,数学家会告诉你这是你可能遇到的最糟糕的奇点之一)。


2
我是一名数学家,这并不是你可能遇到的最糟糕的奇点之一,只是一个极限 :) - Benjamin Gruenbaum
“log 0” 是否未定义取决于上下文。如果是关于非负实数的对数,通常接受“log 0 = -无穷大”这个值。 - Daniel Fischer
@Daniel Fischer,但是什么类型的无穷大?那时事情变得真正有趣。 - Bathsheba
从实数线的两点紧化得到的类型。 - Daniel Fischer
你可能会遇到的最糟糕的奇点是黑洞。 - jason
显示剩余4条评论

1

但为什么不返回NaN,例如当0除以0时(0.0/0.0)。这样做会更好,并且在使用时不会导致错误的计算。Mathematica返回Indeterminate,这也是正确的... - user2512326
请问做出这个设计决策的人。如果您说“任何数的零次方都是一”,那就没有问题了... - Floris
非常感谢,我明白了你的观点。这就是为什么我会问这个问题,它涉及到这个不兼容的设计决策。如果0.0/0.0返回1,那也很奇怪和不兼容。无论如何,我感谢你的回答和花费的时间! - user2512326

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接