| from mpmath import * |
| from random import seed, randint, random |
| import math |
|
|
| |
| |
|
|
| N = 5000 |
| seed(1) |
|
|
| |
| |
| xs = [(random()-1) * 10**randint(-140, 140) for x in range(N)] |
| ys = [(random()-1) * 10**randint(-140, 140) for x in range(N)] |
|
|
| |
| ys[int(N*0.8):] = xs[int(N*0.8):] |
|
|
| |
| |
| uses_x87 = -4.1974624032366689e+117 / -8.4657370748010221e-47 \ |
| == 4.9581771393902231e+163 |
|
|
| def test_double_compatibility(): |
| mp.prec = 53 |
| for x, y in zip(xs, ys): |
| mpx = mpf(x) |
| mpy = mpf(y) |
| assert mpf(x) == x |
| assert (mpx < mpy) == (x < y) |
| assert (mpx > mpy) == (x > y) |
| assert (mpx == mpy) == (x == y) |
| assert (mpx != mpy) == (x != y) |
| assert (mpx <= mpy) == (x <= y) |
| assert (mpx >= mpy) == (x >= y) |
| assert mpx == mpx |
| if uses_x87: |
| mp.prec = 64 |
| a = mpx + mpy |
| b = mpx * mpy |
| c = mpx / mpy |
| d = mpx % mpy |
| mp.prec = 53 |
| assert +a == x + y |
| assert +b == x * y |
| assert +c == x / y |
| assert +d == x % y |
| else: |
| assert mpx + mpy == x + y |
| assert mpx * mpy == x * y |
| assert mpx / mpy == x / y |
| assert mpx % mpy == x % y |
| assert abs(mpx) == abs(x) |
| assert mpf(repr(x)) == x |
| assert ceil(mpx) == math.ceil(x) |
| assert floor(mpx) == math.floor(x) |
|
|
| def test_sqrt(): |
| |
| |
| fail = 0 |
| mp.prec = 53 |
| for x in xs: |
| x = abs(x) |
| mp.prec = 100 |
| mp_high = mpf(x)**0.5 |
| mp.prec = 53 |
| mp_low = mpf(x)**0.5 |
| fp = x**0.5 |
| assert abs(mp_low-mp_high) <= abs(fp-mp_high) |
| fail += mp_low != fp |
| assert fail < N/10 |
|
|
| def test_bugs(): |
| |
| assert mpf(4.4408920985006262E-16) < mpf(1.7763568394002505E-15) |
| assert mpf(-4.4408920985006262E-16) > mpf(-1.7763568394002505E-15) |
|
|