簡體   English   中英

Python 的十進制(和其他精確的十進制庫)是如何實現的,為什么它們比內置的浮點計算慢?

[英]How is Python's decimal (and other precise decimal libraries) implemented and why are they slower than built in floating point calculations?

我一直在閱讀浮點指南以試圖澄清有關浮點數的一些要點,我假設 Python 的十進制庫是鏈接頁面上提到的“有限精度十進制”的實現。

它提到“Limited-Precision Decimal”“與 IEEE 754 二進制浮點基本相同,只是指數被解釋為以 10 為底。因此,沒有意外的舍入錯誤。此外,這種格式相對緊湊和快速,但通常比二進制格式慢。”

Python十進制是否以相同的方式實現? 如果除了指數被不同地解釋之外,表示中的所有其他內容都相同,為什么它更慢,為什么這種表示並不總是優於 IEEE 754 實現? 最后,為什么使用以 10 為底的指數可以防止意外的舍入錯誤?

謝謝!

它提到“有限精度十進制”[...] Python 十進制是否以相同的方式實現?

不,Python 的 Decimal 內部使用以 10 為底的指數,以及任意大的 integer。 由於 integer 的尺寸是無限的,潛在的精度也是無限的。

為什么 [Python's Decimal] 較慢

這有幾個原因。 首先,將兩個不同指數的 Decimal 值相加需要乘以 10,在使用二進制的計算機上,乘以 10 比乘以 2 更昂貴。 其次,進行精確計算比進行近似計算需要更多位數的精度。 第三,IEEE754浮點具有硬件加速,因為它是一種常見的操作。

為什么這種表示並不總是優於 IEEE 754 實現?

速度是一個特征,並不是所有的計算都能從精確完成中受益。 不精確計算的使用比您想象的要廣泛。 例如,Excel 在內部使用浮點數 然而,它有數億用戶,所以顯然你可以只使用浮點數。

最后,為什么使用以 10 為底的指數可以防止意外的舍入錯誤?

這句話的關鍵詞是“出乎意料”。 得知以 10 為底的數字系統無法表示數字 1/3 而不對其進行四舍五入,您不會感到驚訝。 我們理解並且不能完全准確地表示 1/3、1/7 和 1/9。 但是人們對不能准確表示 1/5 的計算機系統的接受程度要低得多。

如果你試圖用二進制表示 0.2,你會得到 0.0011(0011),其中 0011 部分永遠重復。 浮點數沒有無限位數,因此它會在 53 位之后四舍五入(假設為雙精度)並對其進行近似。

這並不是說 Decimal 是完全准確的。 有很多情況會強制舍入。 例如,如果你取 2 的平方根,這是一個無理數,不能表示為精確的小數。

例子:

>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724')
>>> Decimal(2).sqrt() ** 2
Decimal('1.999999999999999999999999999')

十進制是一種數學運算方法,它與您用鉛筆和紙做的答案一致。 為此,它權衡了速度和 memory 的使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM