为什么decimal.Decimal(0)**decimal.Decimal(0)不返回1

4
为什么 decimal.Decimal(0)**decimal.Decimal(0) 不返回1而是一个错误?
import decimal
decimal.Decimal(0)**5  # works and returns Decimal('0') as it should
decimal.Decimal(0)**0  # doesn't not work and should return 1
decimal.Decimal(0)**decimal.Decimal(0)  # same
0**0  # works and returns 1

我可以使用if语句来绕过错误(decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]),但这样做看起来很不优雅。

编辑:我在学校一直学习0的0次方等于1,但是(见评论)实际上它不是。所以如果我想让它成为1,我猜我需要手动设置(在我的情况下这是期望的行为),我不知道有争议关于它的值。


9
0⁰是未定义的。 - John Kugelman
3
在离散的情境中,0的零次方等于0是最合理的惯例,但对于实数并不太有用。 - user2357112
5
与数学网站上的相关讨论:零次幂 - 0^0是否等于1?。引用最佳答案:“一般来说,关于0^0应该是什么,没有一个好的答案,因此通常不予定义。” 请参见https://en.wikipedia.org/wiki/Indeterminate_form。 - Brian61354270
1
我在学校里一直学习的是0的0次方等于1。所以如果我想让它等于1,我猜我会手动设置(在我的情况下这是期望的行为),我不知道有关其值是否存在争议。 - FluidMechanics Potential Flows
糟糕,之前应该写成“0的0次方等于1”。现在已经来不及修改了。 - user2357112
1个回答

2

Python的decimal模块遵循IBM通用十进制算术规范,该规范指出0的0次幂会引发无效操作条件并产生NaN。默认情况下,Python会为无效操作条件抛出decimal.InvalidOperation异常,但如果需要,您可以更改上下文设置以获取NaN:

In [1]: import decimal

In [2]: decimal.getcontext().traps[decimal.InvalidOperation] = False

In [3]: decimal.Decimal(0)**decimal.Decimal(0)
Out[3]: Decimal('NaN')

关于为什么规范以这种方式定义操作,0^0=1是离散情境下最有意义的约定。但对于实数并不那么有用。IEEE 754选择将返回值设为1.0,而IBM则做出了不同的选择。两种选择都是合理的。


你可以更改上下文设置以获取NaN(非数字)(如果需要的话),你想将其更改为1吗? - FluidMechanics Potential Flows
@FluidMechanicsPotentialFlows:不是。 - user2357112
对我来说从来没有讲得通的部分是标准还规定了 decimal.Decimal("inf")**decimal.Decimal("0") 应该等于 1 - Mark Dickinson

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