国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中實現精確的浮點數運算詳解

2020-02-16 10:34:14
字體:
來源:轉載
供稿:網友

為什么說浮點數缺乏精確性?

在開始本文之前,讓我們先來談談浮點數為什么缺乏精確性的問題,其實這不是Python的問題,而是實數的無限精度跟計算機的有限內存之間的矛盾。

舉個例子,假如說我只能使用整數(即只精確到個位,計算機內的浮點數也只有有限精度,以C語言中的雙精度浮點數double為例,精度為52個二進制位),要表示任意實數(無限精度)的時候我就只能通過舍入(rounding)來近似表示。

比如1.2我會表示成1,2.4表示成2,3.6表示成4.

所以呢?

在算1.2 - 1.2的時候,由于計算機表示的問題,我算的實際上是1 - 1,結果是0,碰巧蒙對了;

在算1.2 + 1.2 - 2.4的時候,由于計算機表示的問題,我算的實際上是1 + 1 - 2,結果是0,再次蒙對了;

但是在算1.2 + 1.2 + 1.2 - 3.6的時候,由于計算機表示的問題,我算的實際上是1 + 1 + 1 - 4,結果是-1,運氣沒那么好啦!

這里的1.2, 2.4, 3.6就相當于你問題里的0.1, 0.2和0.3,1, 2, 4則是真正在計算機內部進行運算的數值,我說清楚了嗎?

其他請看IEEE 754浮點數標準,比如CSAPP第二章啥的(雖然估計你沒興趣看)。

另:不僅僅是浮點數的在計算機內部的表示有誤差,運算本身也可能會有誤差。比如整數2可以在計算機內準確表示,但是要算根號2就有誤差了;再比如兩個浮點數相除,本來兩個數都是精確表示的,但除的結果精度卻超出了計算機內實數的表示范圍,然后就有誤差了。

好了,下面話不多說了,開始本文的正文:

起步

浮點數的一個普遍的問題是它們不能精確的表示十進制數。

>>> a = 4.2>>> b = 2.1>>> a + b6.300000000000001>>> (a + b) == 6.3False>>>

這是由于底層 CPU 和IEEE 754 標準通過自己的浮點單位去執行算術時的特征。看似有窮的小數, 在計算機的二進制表示里卻是無窮的。

一般情況下,這一點點的小誤差是允許存在的。如果不能容忍這種誤差(比如金融領域),那么就要考慮用一些途徑來解決這個問題了。

Decimal

使用這個模塊不會出現任何小誤差。

>>> from decimal import Decimal>>> a = Decimal('4.2')>>> b = Decimal('2.1')>>> a + bDecimal('6.3')>>> print(a + b)6.3>>> (a + b) == Decimal('6.3')True

盡管代碼看起來比較奇怪,使用字符串來表示數字,但是 Decimal 支持所有常用的數學運算。 decimal 模塊允許你控制計算的每一方面,包括數字位數和四舍五入。在這樣做之前,需要創建一個臨時上下文環境來改變這種設定:

>>> from decimal import Decimal, localcontext>>> a = Decimal('1.3')>>> b = Decimal('1.7')>>> print(a / b)0.7647058823529411764705882353>>> with localcontext() as ctx:...  ctx.prec = 3...  print(a / b)...0.765>>> with localcontext() as ctx:...  ctx.prec = 50...  print(a / b)...0.76470588235294117647058823529411764705882352941176>>>            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黄龙县| 北碚区| 康定县| 姚安县| 衡东县| 长宁区| 镇安县| 泗阳县| 郧西县| 蓬溪县| 同仁县| 张掖市| 从江县| 贵港市| 准格尔旗| 克东县| 辽宁省| 孟津县| 亚东县| 延津县| 黄龙县| 任丘市| 老河口市| 方城县| 五莲县| 古丈县| 遂宁市| 宁远县| 新竹市| 花莲市| 四川省| 景德镇市| 江山市| 固镇县| 仲巴县| 石柱| 葫芦岛市| 吴旗县| 龙里县| 永登县| 大余县|