[英]How to fix Python rounding error in Floating Point numbers without using decimal, fractions or any other external libraries?
[英]How is Python's decimal (and other precise decimal libraries) implemented and why are they slower than built in floating point calculations?
它提到“有限精度十進制”[...] 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.