python中浮點數(shù)比較判斷!為什么不能用==(推薦)
問題:浮點數(shù)比較為什么不能用==來寫?
答:計算機里面的數(shù)字是由二進(jìn)制保存的,在計算機內(nèi)部有些數(shù)字不能準(zhǔn)確的保存,于是就保存了一個最靠近的數(shù)字。
計算機表示浮點數(shù)(float或double類型)都有一個精度限制,對于超出了精度限制的浮點數(shù),計算機會把它們的精度之外的小數(shù)部分截斷。
因此比較兩個float是否相等,不能僅僅依靠==來判斷,而是當(dāng)他們的兩者的差值小于一個我們可以容忍的小值時,就可以認(rèn)為它們相等。
解決辦法:
1、在python3.5之前,可以通過計算兩個浮點數(shù)之差來判斷兩個浮點數(shù)是否相等:
例子1: abs(f1 - f2) <= allowed_error 可接受的誤差
或:
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)2、python 3.5之后,PEP485提案中給出了解決方案。math模塊新增一個isclose函數(shù)用來判斷兩個浮點數(shù)的值是否接近或相等 例子2:
- 源碼:
isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)
- 參數(shù):
- a,b:兩個需要比較的浮點數(shù);
- rel_tol: 相對于輸入值的大小,被認(rèn)為是“接近”的最大差異;
- abs_tol: 無論輸入值的大小,被認(rèn)為“接近”的最大差異
- 本質(zhì)算法
<strong><code> abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)</code></strong>
import math print(math.isclose(2.1,2.2,rel_tol=0.1)) # 結(jié)果:True # 同理abs_tol也可以自定義
到此這篇關(guān)于python中浮點數(shù)比較判斷!為什么不能用==的文章就介紹到這了,更多相關(guān)python浮點數(shù)比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 在指定范圍內(nèi)隨機生成不重復(fù)的n個數(shù)實例
今天小編就為大家分享一篇python 在指定范圍內(nèi)隨機生成不重復(fù)的n個數(shù)實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-01-01
正則化DropPath/drop_path用法示例(Python實現(xiàn))
DropPath 類似于Dropout,不同的是 Drop將深度學(xué)習(xí)模型中的多分支結(jié)構(gòu)隨機"失效",而Dropout是對神經(jīng)元隨機"失效"這篇文章主要給大家介紹了關(guān)于正則化DropPath/drop_path用法的相關(guān)資料,需要的朋友可以參考下2022-04-04
Python+PuLP實現(xiàn)線性規(guī)劃的求解
線性規(guī)劃(Linear?programming),在線性等式或不等式約束條件下求解線性目標(biāo)函數(shù)的極值問題,常用于解決資源分配、生產(chǎn)調(diào)度和混合問題。本文將利用PuLP實現(xiàn)線性規(guī)劃的求解,需要的可以參考一下2022-04-04

