# 10**308 cannot be represented exactly in f64, thus it is not equal to 1e308 float assert not (10**308 == 1e308) # but the 1e308 float can be converted to big int and then it still should be equal to itself assert int(1e308) == 1e308 # and the equalities should be the same when operands switch sides assert not (1e308 == 10**308) assert 1e308 == int(1e308) # floats that cannot be converted to big ints shouldn’t crash the vm import math assert not (10**500 == math.inf) assert not (math.inf == 10**500) assert not (10**500 == math.nan) assert not (math.nan == 10**500) # comparisons # floats with worse than integer precision assert 2.**54 > 2**54 - 1 assert 2.**54 < 2**54 + 1 assert 2.**54 >= 2**54 - 1 assert 2.**54 <= 2**54 + 1 assert 2.**54 == 2**54 assert not 2.**54 == 2**54 + 1 # inverse operands assert 2**54 - 1 < 2.**54 assert 2**54 + 1 > 2.**54 assert 2**54 - 1 <= 2.**54 assert 2**54 + 1 >= 2.**54 assert 2**54 == 2.**54 assert not 2**54 + 1 == 2.**54 assert not 2.**54 < 2**54 - 1 assert not 2.**54 > 2**54 + 1 # sub-int numbers assert 1.3 > 1 assert 1.3 >= 1 assert 2.5 > 2 assert 2.5 >= 2 assert -0.3 < 0 assert -0.3 <= 0 # int out of float range comparisons assert 10**500 > 2.**54 assert -10**500 < -0.12 # infinity and NaN comparisons assert math.inf > 10**500 assert math.inf >= 10**500 assert not math.inf < 10**500 assert -math.inf < -10*500 assert -math.inf <= -10*500 assert not -math.inf > -10*500 assert not math.nan > 123 assert not math.nan < 123 assert not math.nan >= 123 assert not math.nan <= 123