有人可以用此功能解释这种行为吗?

时间:2019-10-27 18:36:12

标签: python python-3.x floating-point floating-accuracy

>>> 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,我做了一个有时可以正常工作的函数,而其他函数则恰好靠近遮阳篷

我知道它与浮点错误有关,但是为什么对某些输入有效而对其他输入无效?

1 个答案:

答案 0 :(得分: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

当然应该是4.6,但是可以从Python文档here中引用发生的事情:

  

请注意,这本质上是二进制浮点数:这不是Python中的错误,也不是代码中的错误。在支持硬件浮点算术的所有语言中,您都会看到同一种东西(尽管某些语言默认情况下或在所有输出模式下都不会显示差异)。

您可以通过利用Python随附的decimal库来解决此问题:

from decimal import *

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

输出:

4.600000000

在这种情况下,您的精度可以高达13才能正确输出4.6的变化。将其增加到14或更大,您会发现您将再次收到4.59....