|
|
|
@@ -3,7 +3,7 @@ Test bit-level integer and mpf operations
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
from mpmath import eps, fadd, ldexp, mp, mpc, mpf
|
|
|
|
|
from mpmath.libmp import (bitcount, fone, from_float, from_man_exp, fzero,
|
|
|
|
|
from mpmath.libmp import (MPZ, bitcount, fone, from_float, from_man_exp, fzero,
|
|
|
|
|
mpf_add, mpf_neg, mpf_perturb, mpf_sub,
|
|
|
|
|
round_ceiling, round_down, round_floor,
|
|
|
|
|
round_nearest, round_up, to_float, trailing)
|
|
|
|
@@ -27,69 +27,69 @@ def test_trailing():
|
|
|
|
|
assert trailing(2**100-1) == 0
|
|
|
|
|
|
|
|
|
|
def test_round_down():
|
|
|
|
|
assert from_man_exp(0, -4, 4, round_down)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(0xf0, -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf1, -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xff, -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf0, -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf1, -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xff, -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0), -4, 4, round_down)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf0), -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf1), -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xff), -4, 4, round_down)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf0), -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf1), -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xff), -4, 4, round_down)[:3] == (1, 15, 0)
|
|
|
|
|
|
|
|
|
|
def test_round_up():
|
|
|
|
|
assert from_man_exp(0, -4, 4, round_up)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(0xf0, -4, 4, round_up)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf1, -4, 4, round_up)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(0xff, -4, 4, round_up)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xf0, -4, 4, round_up)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf1, -4, 4, round_up)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xff, -4, 4, round_up)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(0), -4, 4, round_up)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf0), -4, 4, round_up)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf1), -4, 4, round_up)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(0xff), -4, 4, round_up)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf0), -4, 4, round_up)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf1), -4, 4, round_up)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xff), -4, 4, round_up)[:3] == (1, 1, 4)
|
|
|
|
|
|
|
|
|
|
def test_round_floor():
|
|
|
|
|
assert from_man_exp(0, -4, 4, round_floor)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(0xf0, -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf1, -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xff, -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf0, -4, 4, round_floor)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf1, -4, 4, round_floor)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xff, -4, 4, round_floor)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(0), -4, 4, round_floor)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf0), -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf1), -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xff), -4, 4, round_floor)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf0), -4, 4, round_floor)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf1), -4, 4, round_floor)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xff), -4, 4, round_floor)[:3] == (1, 1, 4)
|
|
|
|
|
|
|
|
|
|
def test_round_ceiling():
|
|
|
|
|
assert from_man_exp(0, -4, 4, round_ceiling)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(0xf0, -4, 4, round_ceiling)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf1, -4, 4, round_ceiling)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(0xff, -4, 4, round_ceiling)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xf0, -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf1, -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xff, -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0), -4, 4, round_ceiling)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf0), -4, 4, round_ceiling)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf1), -4, 4, round_ceiling)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(0xff), -4, 4, round_ceiling)[:3] == (0, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf0), -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf1), -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xff), -4, 4, round_ceiling)[:3] == (1, 15, 0)
|
|
|
|
|
|
|
|
|
|
def test_round_nearest():
|
|
|
|
|
assert from_man_exp(0, -4, 4, round_nearest)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(0xf0, -4, 4, round_nearest)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf7, -4, 4, round_nearest)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(0xf8, -4, 4, round_nearest)[:3] == (0, 1, 4) # 1111.1000 -> 10000.0
|
|
|
|
|
assert from_man_exp(0xf9, -4, 4, round_nearest)[:3] == (0, 1, 4) # 1111.1001 -> 10000.0
|
|
|
|
|
assert from_man_exp(0xe8, -4, 4, round_nearest)[:3] == (0, 7, 1) # 1110.1000 -> 1110.0
|
|
|
|
|
assert from_man_exp(0xe9, -4, 4, round_nearest)[:3] == (0, 15, 0) # 1110.1001 -> 1111.0
|
|
|
|
|
assert from_man_exp(-0xf0, -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf7, -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(-0xf8, -4, 4, round_nearest)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xf9, -4, 4, round_nearest)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(-0xe8, -4, 4, round_nearest)[:3] == (1, 7, 1)
|
|
|
|
|
assert from_man_exp(-0xe9, -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0), -4, 4, round_nearest)[:3] == (0, 0, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf0), -4, 4, round_nearest)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf7), -4, 4, round_nearest)[:3] == (0, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(0xf8), -4, 4, round_nearest)[:3] == (0, 1, 4) # 1111.1000 -> 10000.0
|
|
|
|
|
assert from_man_exp(MPZ(0xf9), -4, 4, round_nearest)[:3] == (0, 1, 4) # 1111.1001 -> 10000.0
|
|
|
|
|
assert from_man_exp(MPZ(0xe8), -4, 4, round_nearest)[:3] == (0, 7, 1) # 1110.1000 -> 1110.0
|
|
|
|
|
assert from_man_exp(MPZ(0xe9), -4, 4, round_nearest)[:3] == (0, 15, 0) # 1110.1001 -> 1111.0
|
|
|
|
|
assert from_man_exp(MPZ(-0xf0), -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf7), -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf8), -4, 4, round_nearest)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xf9), -4, 4, round_nearest)[:3] == (1, 1, 4)
|
|
|
|
|
assert from_man_exp(MPZ(-0xe8), -4, 4, round_nearest)[:3] == (1, 7, 1)
|
|
|
|
|
assert from_man_exp(MPZ(-0xe9), -4, 4, round_nearest)[:3] == (1, 15, 0)
|
|
|
|
|
|
|
|
|
|
def test_rounding_bugs():
|
|
|
|
|
# 1 less than power-of-two cases
|
|
|
|
|
assert from_man_exp(72057594037927935, -56, 53, round_up) == (0, 1, 0, 1)
|
|
|
|
|
assert from_man_exp(73786976294838205979, -65, 53, round_nearest) == (0, 1, 1, 1)
|
|
|
|
|
assert from_man_exp(31, 0, 4, round_up) == (0, 1, 5, 1)
|
|
|
|
|
assert from_man_exp(-31, 0, 4, round_floor) == (1, 1, 5, 1)
|
|
|
|
|
assert from_man_exp(255, 0, 7, round_up) == (0, 1, 8, 1)
|
|
|
|
|
assert from_man_exp(-255, 0, 7, round_floor) == (1, 1, 8, 1)
|
|
|
|
|
assert from_man_exp(MPZ(72057594037927935), -56, 53, round_up) == (0, 1, 0, 1)
|
|
|
|
|
assert from_man_exp(MPZ(73786976294838205979), -65, 53, round_nearest) == (0, 1, 1, 1)
|
|
|
|
|
assert from_man_exp(MPZ(31), 0, 4, round_up) == (0, 1, 5, 1)
|
|
|
|
|
assert from_man_exp(MPZ(-31), 0, 4, round_floor) == (1, 1, 5, 1)
|
|
|
|
|
assert from_man_exp(MPZ(255), 0, 7, round_up) == (0, 1, 8, 1)
|
|
|
|
|
assert from_man_exp(MPZ(-255), 0, 7, round_floor) == (1, 1, 8, 1)
|
|
|
|
|
|
|
|
|
|
def test_rounding_issue_200():
|
|
|
|
|
a = from_man_exp(9867,-100)
|
|
|
|
|
b = from_man_exp(9867,-200)
|
|
|
|
|
c = from_man_exp(-1,0)
|
|
|
|
|
a = from_man_exp(MPZ(9867),-100)
|
|
|
|
|
b = from_man_exp(MPZ(9867),-200)
|
|
|
|
|
c = from_man_exp(MPZ(-1),0)
|
|
|
|
|
z = (1, 1023, -10, 10)
|
|
|
|
|
assert mpf_add(a, c, 10, 'd') == z
|
|
|
|
|
assert mpf_add(b, c, 10, 'd') == z
|
|
|
|
|