日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python 浮点数运算

發布時間:2025/5/22 python 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python 浮点数运算 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

浮點數用來存儲計算機中的小數,與現實世界中的十進制小數不同的是,浮點數通過二進制的形式來表示一個小數。在深入了解浮點數的實現之前,先來看幾個 Python 浮點數計算有意思的例子:

0.1 == 0.10000000000000000000001 True 0.1+0.1+0.1 == 0.3 False

IEEE 浮點數表示法

這些看起來違反常識的“錯誤”并非 Python 的錯,而是由浮點數的規則所決定的,即使放到其它語言中結果也是這樣的。要理解計算機中浮點數的表示規則,先來看現實世界中十進制小數是如何表示的:

1.234 = 1 + 1/10 + 2/100 + 3/1000

可以用下面的公式來表示:

$$d = \sum_{i=-n}^m10^i*d_i$$

其中 $d_i$ 是十進制中 0~9 的數字。而如果是一個二進制的小數:

1.001 = 1 + 0/2 + 0/4 + 1/8

可以用下面的公式來表示:

$$d = \sum_{i=-n}^m2^i*d_i$$

其中 $d_i$ 是二進制中的 0 或 1。Python 中的浮點數都是雙精度的,也就說采用 64 位來表示一個小數,那這 64 位分別有多少用來表示整數部分和小數部分呢?根據 IEEE 標準,考慮到符號位,雙精度表示法是這樣分配的:

$$d = s * \sum_{i=-52}^{11} 2^i*d_i$$

也就是說用1位表示符號位,11位表示整數部分,52位表示小數部分。正如十進制中我們無法精確表示某些分數(如10/3),浮點數中通過 d1/2 + d2/4 + ... 的方式也會出現這種情況,比如上面的例子中,十進制中簡單的 0.1 就無法在二進制中精確描述,而只能通過近似表示法表示出來:

(0.1).as_integer_ratio() (3602879701896397, 36028797018963968)

也就是說 0.1 是通過 3602879701896397/36028797018963968 來近似表示的,很明顯這樣近似的表示會導致許多差距很小的數字公用相同的近似表示數,例如:

(0.10000000000000001).as_integer_ratio() (3602879701896397, 36028797018963968)

在 Python 中所有這些可以用相同的近似數表示的數字統一采用最短有效數字來表示:

print(0.10000000000000001) 0.1

浮點數運算

既然有些浮點數是通過近似值表示的,那么在計算過程中就很容易出現誤差,就像最開始的第二個例子一樣:

a = .1 + .1 + .1 b = .3 print(a.as_integer_ratio()) print(b.as_integer_ratio()) print(a == b) (1351079888211149, 4503599627370496) (5404319552844595, 18014398509481984) False

為了解決運算中的問題,IEEE 標準還指定了一個舍入規則(round),即 Python 中內置的 round 方法,我們可以通過舍入的方式取得兩個數的近似值,來判斷其近似值是否相等:

round(a, 10) == round(b, 10) True

當然這種舍入的方式并不一定是可靠的,依賴于舍入的選擇的位數,位數太大,就失去了 round 的作用,太小,就會引入別的錯誤:

print(round(a, 17) == round(b, 17)) print(round(0.1, 1) == round(0.111, 1)) False True

Python 中使用更精確的浮點數可以通過 decimal 和 fractions 兩個模塊,從名字上也能猜到,decimal 表示完整的小數,而 fractions 通過分數的形式表示小數:

from decimal import Decimal a = Decimal(0.1) b = Decimal(0.1000000000000001) c = Decimal(0.10000000000000001) print(a) print(b) print(c)a == b == c 0.1000000000000000055511151231257827021181583404541015625 0.10000000000000010269562977782697998918592929840087890625 0.1000000000000000055511151231257827021181583404541015625False from fractions import Fraction f1 = Fraction(1, 10) # 0.1 print(float(f1)) f3 = Fraction(3, 10) # 0.3 print(float(f3))print(f1 + f1 + f1 == f3) 0.1 0.3 True

總結

浮點數這些奇特的特性讓我們不得不在使用的時候格外注意,尤其是當有一定的精度要求的情況下。如果真的是對精度要求較高且需要頻繁使用浮點數,建議使用更專業的 SciPy 科學計算包。


轉載于:https://my.oschina.net/rainyear/blog/673802

總結

以上是生活随笔為你收集整理的Python 浮点数运算的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。