簡體   English   中英

python:math.sqrt(x)函數有多准確?

[英]python: how accurate math.sqrt(x) function is?

請考慮Python中的以下代碼片段:

m = int(math.sqrt(n))

對於n = 25,它應該給出m = 5(並且它在我的shell中)。 但是根據我的C經驗,我知道使用這樣的表達式是一個壞主意,因為sqrt函數可能返回比實際值稍低的值,然后在舍入后我可能得到m = 4而不是m = 5.這個限制是否也是參與python? 如果是這種情況,那么在python中編寫這樣的表達式的最佳方法是什么? 如果我使用Java或C#會發生什么? 此外,如果有任何不准確之處,有哪些因素可以控制它的數量?

為了正確的舍入,使用round() ; 它舍入到最接近的整數,但返回一個浮點數。 然后你可以從結果中構造一個int

(很可能你的代碼不是性能關鍵的,你永遠不會注意到與round()相關的任何減速。如果你這樣做,你可能應該使用numpy。)

如果您非常關心sqrt的准確性,可以使用標准庫中的decimal.Decimal類 ,它提供自己的sqrt函數。 Decimal類可以設置為比常規Python float更高的精度。 也就是說,如果你正在進行四舍五入也許並不重要。 Decimal類產生確切的數字(來自文檔):

[十進制]的精確性延續到算術中。 在十進制浮點數中, 0.1 + 0.1 + 0.1 - 0.3正好等於零。 在二進制浮點數中,結果為5.5511151231257827e-017 雖然接近於零,但差異阻止了可靠的相等性測試,並且差異可能會累積。 因此,在具有嚴格相等不變量的會計應用程序中,decimal是首選。

解決方案很簡單。 如果您期望整數結果,請使用int(math.sqrt(n)+。1)。 如果該值略大於或小於整數結果,則它將舍入到正確的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM