導航:首頁 > 編程語言 > python數據精度

python數據精度

發布時間:2025-07-02 19:29:00

⑴ 關於python浮點數的精度及其造成的問題

在解決學術問題的過程中,Python因為其易用性和語法的簡潔性而受到歡迎。然而,在某些實際問題中,由於Python默認的浮點數精度是雙精度(64位),直接用此精度會出現非常大的問題。例如,回代根到等式發現等式不成立(從而造成恐慌)。本文記錄了一種筆者找到的可能的解決方法用於解決Python精度不夠的問題。

Python的默認浮點數是雙精度。不過不論是什麼精度,浮點數在計算機中都是以二進制保存。這就導致了在有限精度下,電腦為自己把精度范圍外的小數「掐掉」,導致結果不準確。以下筆者展現一個經典的例子,0.1 + 0.2,其結果為0.30000000000000004,而不是0.3。

經過一些搜索,發現NumPy提供一個相對更高精度的數值類型numpy.float128()(或者numpy.longdouble(), numpy.longfloat()),它的精度比64位「稍高」。使用numpy.float128()之後,輸出的結果更加接近真實值0.3。

這會導致什麼問題?在大多數情況下(姑且如此說,畢竟我至今第一次遇到這個問題),不會有很大影響。但這不代表這個問題可以忽略。例如在使用SymPy求解方程時,如果直接使用默認浮點數,得到的結果並不能使等式兩邊成立。

我們首先嘗試將64位浮點數替換為128位浮點數,但不幸的是,這種方法得到的精度提升有限。方程兩邊仍然無法成立。

通過搜索和求助,我得知了使用decimal包的方法。使用十進制數,這樣應該就可以表示准確的小數了。但是如果直接使用SymPy去解方程,仍然不能得到精確結果!我推測SymPy仍然使用了浮點數。

在已知方程系數的情況下,求解方程的根有兩種方法。一種是直接使用求根公式,適用於四次及以下的多項式方程。另一種是數值法,可以得到一個自定精度的估計值。

由於Python的decimal包中的Decimal類型的特殊性,許多常用的運算方法並不適用此類數值。接下來記錄幾種我從官方文檔和Wikiversity中找到的常用運算方法。

來自Python官方文檔:

來自Wikiversity:

可能有讀者會好奇,為什麼要摘錄arctan()。原因是需要進行復數運算!在次數為2、3、4的一元方程中,非常容易出現復數。我針對自己的問題,對arctan()函數進行了一定的修改,並實現了能夠進行復數運算的幾種方法。此外,還定義了判斷兩個數是否相等的函數if_eq()。

到目前為止,我們已經能解決高達四次的一元方程。然而,對於大於或等於五次的多項式來說,現有方法似乎仍然顯得黔驢技窮。

在沒有求根公式的情況下,數值方法是一個解方程實根的很好途徑。我使用了牛頓法來解決問題。參考Kong等人的在線書籍,代碼實現如下,

到此為止,我們可以嘗試一下,能否使用現有知識求解本文最初設置的方程。首先使用求根公式法,成功得到了方程的解!通過觀察可得,僅僅是小數後被掐掉的部分不同,就會造成等式兩邊產生極大(絕對來說,非相對)的不同!

其次,嘗試牛頓數值法。

可以看到,數值法的缺陷是需要設置不同的初值,才能得到不同的實根。但優點是,在計算機性能支持的前提下,可以逼近任意方程的某個根。可能有些讀者會好奇,此處的「-10000000000000000000000」為何不需要將其進行「十進制化」?原因是在Python中,整數是精確的,不精確的只是浮點數。

本文討論了在某些特殊方程中因為Python浮點數不夠精確而導致的結果不精確的問題。當對結果的精度要求較高或者根的量級非常大時,推薦使用先求初值、再求精確值的方法進行求解。

閱讀全文

與python數據精度相關的資料

熱點內容
三星手機加密中斷怎麼回事 瀏覽:535
訓練模型init源碼 瀏覽:837
程序編譯是誰的功能 瀏覽:502
qq收藏怎樣設置加密 瀏覽:288
伺服器的視頻怎麼保存 瀏覽:346
下載暗黑2壓縮包解壓後無法啟動 瀏覽:743
安卓手機刪除了的照片怎麼找回來 瀏覽:347
安卓文件夾顯示多圖 瀏覽:884
文件夾內變目錄 瀏覽:859
歐盟程序員培訓 瀏覽:183
linux登錄ftp命令 瀏覽:741
群暉如何給一個用戶建個文件夾 瀏覽:248
手機版我的世界空島戰爭伺服器地址 瀏覽:556
m4a如何上傳到釘釘群文件夾 瀏覽:605
為什麼安卓app更新比蘋果快 瀏覽:960
松下gr7軟體怎麼編譯程序 瀏覽:473
壓縮空氣能不能呼吸用 瀏覽:478
java調用遠程介面 瀏覽:854
java紅色的嘆號 瀏覽:378
明傢具pdf 瀏覽:140