為什么不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,我想我會手動進行(在我的情況下這是所需的行為),我不知道關于它的價值存在爭議。
uj5u.com熱心網友回復:
Python 的decimal模塊遵循IBM General Decimal Arithmetic Specification,該規范表示0 的 0 次方會引發無效操作條件并產生 NaN。默認情況下,Python 會decimal.InvalidOperation針對 Invalid Operation 條件引發例外,但您可以根據需要更改背景關系設定以獲取 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 做出了不同的選擇。兩種選擇都是合理的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/441745.html
上一篇:假設n是一個正偶整數,那么在這段代碼運行之后x的值是多少?
下一篇:如何逼近幾何增長序列的函式?
