Когда А больше или равно В, но А минус В больше 0?

Есть два числа А и В. Программа выдала такой результат:

А-В>=0 True
A>=В   False

При каких значениях A и B такое может быть?


Ответы (1 шт):

Автор решения: nomnoms12

Чёрная магия:

A = 9007199254740992.0
B = 9007199254740993

print(A - B >= 0)  # True
print(A >= B)      # False


Поведение связано с типами чисел. Одно число представлено как int и имеет бесконечную точность в Python, а второе — как float, и его точность зависит от платформы.

На платформах IEEE 754 мантисса чисел двойной точности содержит 53 бита:

import sys

sys.float_info.mant_dig  # 53

Поэтому некоторые числа не могут быть точно представлены и округляются:

x = 1 << 53       # 9007199254740992

y = float(x)      # 9007199254740992.0
z = float(x + 1)  # 9007199254740992.0
y == z            # True

Округление (из-за приведения типа) происходит при любых математических операциях, если хотя бы один из операндов имеет тип float:

9007199254740992.0 - 9007199254740993
9007199254740992.0 - 9007199254740992.0 = 0

Но сравнение выполняется математически точно, приведение типов не требуется.

→ Ссылка