/rpython/rlib/test/test_longlong2float.py
Python | 97 lines | 80 code | 15 blank | 2 comment | 10 complexity | 19e760b8ed6c37f63378a734b62a725d MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
- from rpython.translator.c.test.test_genc import compile
- from rpython.rlib.longlong2float import longlong2float, float2longlong
- from rpython.rlib.longlong2float import uint2singlefloat, singlefloat2uint
- from rpython.rlib.rarithmetic import r_singlefloat, r_longlong
- from rpython.rtyper.test.test_llinterp import interpret
- def fn(f1):
- ll = float2longlong(f1)
- f2 = longlong2float(ll)
- return f2
- def enum_floats():
- inf = 1e200 * 1e200
- yield 0.0
- yield -0.0
- yield 1.0
- yield -2.34567
- yield 2.134891117e22
- yield inf
- yield -inf
- yield inf / inf # nan
- def test_float2longlong():
- assert float2longlong(0.0) == r_longlong(0)
- def test_longlong_as_float():
- for x in enum_floats():
- res = fn(x)
- assert repr(res) == repr(x)
- def test_compiled():
- fn2 = compile(fn, [float])
- for x in enum_floats():
- res = fn2(x)
- assert repr(res) == repr(x)
- def test_interpreted():
- def f(f1):
- try:
- ll = float2longlong(f1)
- return longlong2float(ll)
- except Exception:
- return 500
- for x in enum_floats():
- res = interpret(f, [x])
- assert repr(res) == repr(x)
- # ____________________________________________________________
- def fnsingle(f1):
- sf1 = r_singlefloat(f1)
- ii = singlefloat2uint(sf1)
- sf2 = uint2singlefloat(ii)
- f2 = float(sf2)
- return f2
- def test_int_as_singlefloat():
- for x in enum_floats():
- res = fnsingle(x)
- assert repr(res) == repr(float(r_singlefloat(x)))
- def test_compiled_single():
- fn2 = compile(fnsingle, [float])
- for x in enum_floats():
- res = fn2(x)
- assert repr(res) == repr(float(r_singlefloat(x)))
- # ____________________________________________________________
- def fn_encode_nan(f1, i2):
- from rpython.rlib.longlong2float import can_encode_float, can_encode_int32
- from rpython.rlib.longlong2float import encode_int32_into_longlong_nan
- from rpython.rlib.longlong2float import decode_int32_from_longlong_nan
- from rpython.rlib.longlong2float import is_int32_from_longlong_nan
- from rpython.rlib.rfloat import isnan
- assert can_encode_float(f1)
- assert can_encode_int32(i2)
- l1 = float2longlong(f1)
- l2 = encode_int32_into_longlong_nan(i2)
- assert not is_int32_from_longlong_nan(l1)
- assert is_int32_from_longlong_nan(l2)
- f1b = longlong2float(l1)
- assert f1b == f1 or (isnan(f1b) and isnan(f1))
- assert decode_int32_from_longlong_nan(l2) == i2
- return 42
- def test_compiled_encode_nan():
- fn2 = compile(fn_encode_nan, [float, int])
- ints = [int(-2**31), int(2**31-1), 42]
- for x in enum_floats():
- y = ints.pop()
- ints.insert(0, y)
- fn_encode_nan(x, y)
- res = fn2(x, y)
- assert res == 42