Coverage for /usr/lib/python3/dist-packages/sympy/polys/domains/realfield.py: 63%
82 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1"""Implementation of :class:`RealField` class. """
4from sympy.core.numbers import Float
5from sympy.polys.domains.field import Field
6from sympy.polys.domains.simpledomain import SimpleDomain
7from sympy.polys.domains.characteristiczero import CharacteristicZero
8from sympy.polys.domains.mpelements import MPContext
9from sympy.polys.polyerrors import CoercionFailed
10from sympy.utilities import public
12@public
13class RealField(Field, CharacteristicZero, SimpleDomain):
14 """Real numbers up to the given precision. """
16 rep = 'RR'
18 is_RealField = is_RR = True
20 is_Exact = False
21 is_Numerical = True
22 is_PID = False
24 has_assoc_Ring = False
25 has_assoc_Field = True
27 _default_precision = 53
29 @property
30 def has_default_precision(self):
31 return self.precision == self._default_precision
33 @property
34 def precision(self):
35 return self._context.prec
37 @property
38 def dps(self):
39 return self._context.dps
41 @property
42 def tolerance(self):
43 return self._context.tolerance
45 def __init__(self, prec=_default_precision, dps=None, tol=None):
46 context = MPContext(prec, dps, tol, True)
47 context._parent = self
48 self._context = context
50 self.dtype = context.mpf
51 self.zero = self.dtype(0)
52 self.one = self.dtype(1)
54 def __eq__(self, other):
55 return (isinstance(other, RealField)
56 and self.precision == other.precision
57 and self.tolerance == other.tolerance)
59 def __hash__(self):
60 return hash((self.__class__.__name__, self.dtype, self.precision, self.tolerance))
62 def to_sympy(self, element):
63 """Convert ``element`` to SymPy number. """
64 return Float(element, self.dps)
66 def from_sympy(self, expr):
67 """Convert SymPy's number to ``dtype``. """
68 number = expr.evalf(n=self.dps)
70 if number.is_Number:
71 return self.dtype(number)
72 else:
73 raise CoercionFailed("expected real number, got %s" % expr)
75 def from_ZZ(self, element, base):
76 return self.dtype(element)
78 def from_ZZ_python(self, element, base):
79 return self.dtype(element)
81 def from_QQ(self, element, base):
82 return self.dtype(element.numerator) / element.denominator
84 def from_QQ_python(self, element, base):
85 return self.dtype(element.numerator) / element.denominator
87 def from_ZZ_gmpy(self, element, base):
88 return self.dtype(int(element))
90 def from_QQ_gmpy(self, element, base):
91 return self.dtype(int(element.numerator)) / int(element.denominator)
93 def from_AlgebraicField(self, element, base):
94 return self.from_sympy(base.to_sympy(element).evalf(self.dps))
96 def from_RealField(self, element, base):
97 if self == base:
98 return element
99 else:
100 return self.dtype(element)
102 def from_ComplexField(self, element, base):
103 if not element.imag:
104 return self.dtype(element.real)
106 def to_rational(self, element, limit=True):
107 """Convert a real number to rational number. """
108 return self._context.to_rational(element, limit)
110 def get_ring(self):
111 """Returns a ring associated with ``self``. """
112 return self
114 def get_exact(self):
115 """Returns an exact domain associated with ``self``. """
116 from sympy.polys.domains import QQ
117 return QQ
119 def gcd(self, a, b):
120 """Returns GCD of ``a`` and ``b``. """
121 return self.one
123 def lcm(self, a, b):
124 """Returns LCM of ``a`` and ``b``. """
125 return a*b
127 def almosteq(self, a, b, tolerance=None):
128 """Check if ``a`` and ``b`` are almost equal. """
129 return self._context.almosteq(a, b, tolerance)
132RR = RealField()