提问人:leoking2000 提问时间:10/28/2019 最后编辑:Vadim Kotovleoking2000 更新时间:10/29/2019 访问量:55
有人可以用这个函数解释这种行为吗?
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,我做了这个功能,它有时有效,有时它只是靠近awnser
我知道它与浮点错误有关,但为什么对某些输入有效,而在其他输入中不起作用?
答:
1赞
felipe
10/28/2019
#1
当您分离函数时,更容易测试这一点:
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(x-y)
var = -891.7 + 896.3
print(var)
输出:
4.599999999999909
当然,这应该是 ,但正在发生的事情可以从 Python 的文档中参考:4.6
请注意,这是二进制浮点的本质:这不是 Python 中的错误,也不是代码中的错误。在支持硬件浮点运算的所有语言中,你都会看到同样的东西(尽管某些语言在默认情况下或在所有输出模式下可能不会显示差异)。
您可以通过利用 Python 附带的 decimal
库来解决此问题:
from decimal import *
getcontext().prec = 10
var = Decimal(-891.7) + Decimal(896.3)
print(var)
输出:
4.600000000
在这种情况下,精度可以高达 13,以便正确输出 的变体。将其增加到 14 或更大,您会注意到您将再次收到您的 .4.6
4.59....
评论
why would work for some inputs and not in others?
——因为有些数字可以用浮点数精确表示,而有些则不能。其中,有些是近似的,当你按照你的预期打印它们时,有些则不是。my_max(-1.0e100,1.0e10)