PageRenderTime 37ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/rpython/rlib/test/test_longlong2float.py

https://bitbucket.org/pypy/pypy/
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
  1. from rpython.translator.c.test.test_genc import compile
  2. from rpython.rlib.longlong2float import longlong2float, float2longlong
  3. from rpython.rlib.longlong2float import uint2singlefloat, singlefloat2uint
  4. from rpython.rlib.rarithmetic import r_singlefloat, r_longlong
  5. from rpython.rtyper.test.test_llinterp import interpret
  6. def fn(f1):
  7. ll = float2longlong(f1)
  8. f2 = longlong2float(ll)
  9. return f2
  10. def enum_floats():
  11. inf = 1e200 * 1e200
  12. yield 0.0
  13. yield -0.0
  14. yield 1.0
  15. yield -2.34567
  16. yield 2.134891117e22
  17. yield inf
  18. yield -inf
  19. yield inf / inf # nan
  20. def test_float2longlong():
  21. assert float2longlong(0.0) == r_longlong(0)
  22. def test_longlong_as_float():
  23. for x in enum_floats():
  24. res = fn(x)
  25. assert repr(res) == repr(x)
  26. def test_compiled():
  27. fn2 = compile(fn, [float])
  28. for x in enum_floats():
  29. res = fn2(x)
  30. assert repr(res) == repr(x)
  31. def test_interpreted():
  32. def f(f1):
  33. try:
  34. ll = float2longlong(f1)
  35. return longlong2float(ll)
  36. except Exception:
  37. return 500
  38. for x in enum_floats():
  39. res = interpret(f, [x])
  40. assert repr(res) == repr(x)
  41. # ____________________________________________________________
  42. def fnsingle(f1):
  43. sf1 = r_singlefloat(f1)
  44. ii = singlefloat2uint(sf1)
  45. sf2 = uint2singlefloat(ii)
  46. f2 = float(sf2)
  47. return f2
  48. def test_int_as_singlefloat():
  49. for x in enum_floats():
  50. res = fnsingle(x)
  51. assert repr(res) == repr(float(r_singlefloat(x)))
  52. def test_compiled_single():
  53. fn2 = compile(fnsingle, [float])
  54. for x in enum_floats():
  55. res = fn2(x)
  56. assert repr(res) == repr(float(r_singlefloat(x)))
  57. # ____________________________________________________________
  58. def fn_encode_nan(f1, i2):
  59. from rpython.rlib.longlong2float import can_encode_float, can_encode_int32
  60. from rpython.rlib.longlong2float import encode_int32_into_longlong_nan
  61. from rpython.rlib.longlong2float import decode_int32_from_longlong_nan
  62. from rpython.rlib.longlong2float import is_int32_from_longlong_nan
  63. from rpython.rlib.rfloat import isnan
  64. assert can_encode_float(f1)
  65. assert can_encode_int32(i2)
  66. l1 = float2longlong(f1)
  67. l2 = encode_int32_into_longlong_nan(i2)
  68. assert not is_int32_from_longlong_nan(l1)
  69. assert is_int32_from_longlong_nan(l2)
  70. f1b = longlong2float(l1)
  71. assert f1b == f1 or (isnan(f1b) and isnan(f1))
  72. assert decode_int32_from_longlong_nan(l2) == i2
  73. return 42
  74. def test_compiled_encode_nan():
  75. fn2 = compile(fn_encode_nan, [float, int])
  76. ints = [int(-2**31), int(2**31-1), 42]
  77. for x in enum_floats():
  78. y = ints.pop()
  79. ints.insert(0, y)
  80. fn_encode_nan(x, y)
  81. res = fn2(x, y)
  82. assert res == 42