почему эти поплавки не оцениваются как равные? - PullRequest
1 голос
/ 30 марта 2011

В следующем коде, если x0 == x1 и y0 == y1, это должно сказать мне об этом. В примере, который я использую, они есть. Тем не менее, Python только говорит, что значения x равны, а не y.

Вот код:

print "arc2x0 = ", arc2x0, ", arc2x1 = ", arc2x1
print "arc2y0 = ", arc2y0, ", arc2y1 = ", arc2y1

if arc2x0 == arc2x1:
    print "x0 == x1"
else:
    print "x0 != x1"

if arc2y0 == arc2y1:
    print "y0 == y1"
else:
    print "y0 != y1"

А вот и вывод:

arc2x0 =  5 , arc2x1 =  5.0
arc2y0 =  -4.16026900507 , arc2y1 =  -4.16026900507
x0 == x1
y0 != y1

Есть идеи, почему значения y тестируются как равные? Эти значения рассчитываются одинаково. Может быть, есть нечто большее, чем то, что я вижу, это не равно? Любой способ напечатать эту точность или любые другие идеи о том, как отладить это?

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Да, больше точности, чем вы видите.Проблема в том, что оператор == обычно не должен использоваться с плавающей точкой.Числа с плавающей запятой имеют ограниченную точность и накапливают ошибку округления, а также неточность из-за невозможности точно хранить все десятичные значения.например,

>>> print '%.18f' % 0.1
0.100000000000000006

>>> 0.4 - 0.3 == 0.1
False

Лучший способ сравнить числа с плавающей точкой на равенство - сравнить, если они почти равны:

def nearly_equal(x, y, epsilon=1e-7):
    return abs(x - y) < epsilon

Сравнивая, если разница между числами меньше значения эпсилона,который указывает, как близко считается достаточно близко, чтобы быть равным.

Вы всегда можете использовать тип decimal.Decimal, чтобы избежать этих проблем.

1 голос
/ 30 марта 2011

Это связано с тем, как работает с плавающей запятой, вы должны вручную обрезать числа, чтобы повысить точность до нужных вам цифр:

a=-4.16026900507

figures =9
a=round(a*(10**figures))/(10**figures) # truncates the digits
print a

Но я думаю, что лучше всего использовать десятичную дробь:

from decimal import *
a = Decimal ('your number as a string')
1 голос
/ 30 марта 2011

См. здесь .

...