Skip to content

Commit 920e433

Browse files
committed
Added Float Class and Tests
1 parent 517c79a commit 920e433

File tree

2 files changed

+81
-4
lines changed

2 files changed

+81
-4
lines changed

symengine/sympy_compat.py

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
from .compatibility import with_metaclass
44
from .lib.symengine_wrapper import (sympify, sympify as S,
55
SympifyError, sqrt, I, E, pi, Matrix, Derivative, exp,
6-
factorial, gcd, lcm, factor, nextprime, mod_inverse,
7-
totient, primitive_root, Lambdify as lambdify, symarray,
8-
diff, eye, diag, ones, zeros, expand, Subs,
6+
nextprime, mod_inverse, primitive_root, Lambdify as lambdify,
7+
symarray, diff, eye, diag, ones, zeros, expand, Subs,
98
FunctionSymbol as AppliedUndef)
109
from types import ModuleType
1110
import sys
1211

12+
def dps_to_prec(n):
13+
"""Return the number of bits required to represent n decimals accurately."""
14+
return max(1, int(round((int(n)+1)*3.3219280948873626)))
1315

1416
class BasicMeta(type):
1517
def __instancecheck__(self, instance):
@@ -45,6 +47,47 @@ def __new__(cls, i):
4547
return symengine.Integer(i)
4648

4749

50+
class Float(Number):
51+
_classes = (symengine.RealDouble, symengine.RealMPFR)
52+
53+
def __new__(cls, num, dps=None, precision=None):
54+
if dps is not None and precision is not None:
55+
raise ValueError('Both decimal and binary precision supplied. '
56+
'Supply only one. ')
57+
if dps is None and precision is None:
58+
dps = 15
59+
if precision is None:
60+
precision = dps_to_prec(dps)
61+
62+
if HAVE_SYMENGINE_MPFR:
63+
if precision > 53:
64+
if isinstance(num, symengine.RealDouble):
65+
return symengine.RealMPFR(str(num), precision)
66+
elif isinstance(num, symengine.RealMPFR):
67+
if precision == num.get_prec():
68+
return num
69+
else:
70+
return symengine.RealMPFR(str(num), precision)
71+
else:
72+
return symengine.RealMPFR(str(num), precision)
73+
else:
74+
if isinstance(num, symengine.RealDouble):
75+
return num
76+
else:
77+
return symengine.RealDouble(float(num))
78+
else:
79+
if precision > 53:
80+
raise ValueError('RealMPFR unavailable for high precision numerical values.')
81+
else:
82+
if isinstance(num, symengine.RealDouble):
83+
return num
84+
else:
85+
return symengine.RealDouble(float(str(num)))
86+
87+
88+
RealNumber = Float
89+
90+
4891
class Add(Basic):
4992
_classes = (symengine.Add,)
5093

symengine/tests/test_sympy_compat.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from symengine.sympy_compat import (Integer, Rational, S, Basic, Add, Mul,
2-
Pow, symbols, Symbol, log, sin, sech, csch, zeros, atan2, Number)
2+
Pow, symbols, Symbol, log, sin, sech, csch, zeros, atan2, Number, Float,
3+
symengine)
34

45

56
def test_Integer():
@@ -24,6 +25,39 @@ def test_Rational():
2425
assert not isinstance(x, Number)
2526

2627

28+
def test_Float():
29+
A = Float("1.23", precision = 53)
30+
B = Float("1.23")
31+
C = Float(A)
32+
assert A == B == C
33+
assert isinstance(A, Float)
34+
assert isinstance(B, Float)
35+
assert isinstance(C, Float)
36+
assert isinstance(A, symengine.RealDouble)
37+
assert isinstance(B, symengine.RealDouble)
38+
assert isinstance(C, symengine.RealDouble)
39+
raises(ValueError, lambda: Float("1.23", dps = 3, precision = 10))
40+
raises(ValueError, lambda: Float(A, dps = 3, precision = 16))
41+
if HAVE_SYMENGINE_MPFR:
42+
A = Float("1.23", dps = 16)
43+
B = Float("1.23", precision = 56)
44+
assert A == B
45+
assert isinstance(A, Float)
46+
assert isinstance(B, Float)
47+
assert isinstance(A, symengine.RealMPFR)
48+
assert isinstance(B, symengine.RealMPFR)
49+
A = Float(C, dps = 16)
50+
assert A == B
51+
assert isinstance(A, Float)
52+
assert isinstance(A, symengine.RealMPFR)
53+
A = Float(A, precision = 53)
54+
assert A == C
55+
assert isinstance(A, Float)
56+
assert isinstance(A, symengine.RealDouble)
57+
if not HAVE_SYMENGINE_MPFR:
58+
raises(ValueError, lambda: Float("1.23", precision = 58))
59+
60+
2761
def test_Add():
2862
x, y = symbols("x y")
2963
i = Add(x, x)

0 commit comments

Comments
 (0)