Может кто-нибудь объяснить это поведение с помощью этой функции? - PullRequest
0 голосов
/ 27 октября 2019
>>> 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 Ответ

1 голос
/ 27 октября 2019

Проще проверить это, когда вы отделите функцию:

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 здесь :

Обратите внимание, что это по своей природе двоичная с плавающей запятой: это не ошибка в Python и не ошибка в вашем коде. Вы увидите то же самое на всех языках, которые поддерживают арифметику с плавающей запятой вашего оборудования (хотя некоторые языки могут не отображать разницу по умолчанию или во всех режимах вывода).

Вы можетеРешите эту проблему, используя библиотеку decimal, поставляемую с Python:

from decimal import *

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

output:

4.600000000

В этом случае ваша точность может быть настолько большойкак 13 для правильного вывода вариации 4.6. Увеличьте его до 14 или больше, и вы заметите, что снова получите свой 4.59.....

...