簡體   English   中英

有人可以用這個 function 解釋這種行為嗎?

[英]Can someone explain this behavior with this function?

>>> def my_max(x,y):
        return ( x + y + abs(x - y)) / 2
>>> my_max(-894,2.3)
2.2999999999999545
>>> my_max(34,77)
77.0
>>> my_max(0.1,0.01)
0.1
>>> my_max(-0.1 , 0.01)
0.009999999999999995

我只是在玩 python,我做了這個 function,它有時可以工作,而其他的它只是靠近 awnser

我知道它與浮點錯誤有關,但為什么對某些輸入有效,而對其他輸入無效?

將 function 分開時更容易測試:

def m(x, y):

    first = x + y
    second = abs(x - y)
    third = first + second
    fourth = third / 2

    print("x+y\t\t\t", first)
    print("abs(x-y)\t\t", second)
    print("x+y + abs(x-y)\t\t", third)
    print("(x+y + abs(x-y))/2\t", fourth)

m(-894, 2.3)

您會收到以下輸出:

x+y                  -891.7
abs(x-y)             896.3
x+y + abs(x-y)       4.599999999999909
(x+y + abs(x-y))/2   2.2999999999999545

現在看x+y + abs(xy)我們有以下內容:

var = -891.7 + 896.3
print(var)

哪個輸出:

4.599999999999909

當然,這應該是4.6 ,但是可以從 Python 的文檔中參考這里發生的事情:

請注意,這是二進制浮點的本質:這不是 Python 中的錯誤,也不是您的代碼中的錯誤。 您將在所有支持硬件浮點運算的語言中看到相同的內容(盡管某些語言默認情況下可能不顯示差異,或者在所有 output 模式下)。

您可以使用 Python 附帶的decimal庫來解決此問題:

from decimal import *

getcontext().prec = 10
var = Decimal(-891.7) + Decimal(896.3)
print(var)

輸出:

4.600000000

在這種情況下,您的精度可以高達 13 以使其正確 output 變體4.6 將其增加到 14 或更大,您會注意到您將再次收到4.59....

暫無
暫無

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

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