Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
from __future__ import print_function, division
from sympy.core.singleton import S from sympy.core.function import Function from sympy.core import Add from sympy.core.evalf import get_integer_part, PrecisionExhausted from sympy.core.numbers import Integer from sympy.core.relational import Gt, Lt, Ge, Le from sympy.core.symbol import Symbol
############################################################################### ######################### FLOOR and CEILING FUNCTIONS ######################### ###############################################################################
class RoundFunction(Function): """The base class for rounding functions."""
@classmethod def eval(cls, arg): i = im(arg) if not i.has(S.ImaginaryUnit): return cls(i)*S.ImaginaryUnit return cls(arg, evaluate=False)
# Integral, numerical, symbolic part
# Extract integral (or complex integral) terms
ipart += t else:
return ipart
# Evaluate npart numerically if independent of spart not spart or npart.is_real and (spart.is_imaginary or (S.ImaginaryUnit*spart).is_real) or npart.is_imaginary and spart.is_real): npart, cls._dir, {}, return_ints=True) except (PrecisionExhausted, NotImplementedError): pass
return ipart + cls(im(spart), evaluate=False)*S.ImaginaryUnit else:
def _eval_is_finite(self):
def _eval_is_real(self):
def _eval_is_integer(self):
class floor(RoundFunction): """ Floor is a univariate function which returns the largest integer value not greater than its argument. However this implementation generalizes floor to complex numbers.
Examples ========
>>> from sympy import floor, E, I, Float, Rational >>> floor(17) 17 >>> floor(Rational(23, 10)) 2 >>> floor(2*E) 5 >>> floor(-Float(0.567)) -1 >>> floor(-I/2) -I
See Also ========
sympy.functions.elementary.integers.ceiling
References ==========
.. [1] "Concrete mathematics" by Graham, pp. 87 .. [2] http://mathworld.wolfram.com/FloorFunction.html
""" _dir = -1
@classmethod def _eval_number(cls, arg): else: return arg return arg return arg return arg.approximation_interval(Integer)[0]
def _eval_nseries(self, x, n, logx): r = self.subs(x, 0) args = self.args[0] args0 = args.subs(x, 0) if args0 == r: direction = (args - args0).leadterm(x)[0] if direction.is_positive: return r else: return r - 1 else: return r
def __le__(self, other): if self.args[0] == other and other.is_real: return S.true return Le(self, other, evaluate=False)
def __gt__(self, other): if self.args[0] == other and other.is_real: return S.false return Gt(self, other, evaluate=False)
class ceiling(RoundFunction): """ Ceiling is a univariate function which returns the smallest integer value not less than its argument. Ceiling function is generalized in this implementation to complex numbers.
Examples ========
>>> from sympy import ceiling, E, I, Float, Rational >>> ceiling(17) 17 >>> ceiling(Rational(23, 10)) 3 >>> ceiling(2*E) 6 >>> ceiling(-Float(0.567)) 0 >>> ceiling(I/2) I
See Also ========
sympy.functions.elementary.integers.floor
References ==========
.. [1] "Concrete mathematics" by Graham, pp. 87 .. [2] http://mathworld.wolfram.com/CeilingFunction.html
""" _dir = 1
@classmethod def _eval_number(cls, arg): elif arg.is_Float: return Integer(int(arg.ceiling())) else: return arg elif isinstance(arg, ceiling): return arg elif isinstance(arg, floor): return arg if arg.is_NumberSymbol: return arg.approximation_interval(Integer)[1]
def _eval_nseries(self, x, n, logx): r = self.subs(x, 0) args = self.args[0] args0 = args.subs(x, 0) if args0 == r: direction = (args - args0).leadterm(x)[0] if direction.is_positive: return r + 1 else: return r else: return r
def __lt__(self, other): if self.args[0] == other and other.is_real: return S.false return Lt(self, other, evaluate=False)
def __ge__(self, other): if self.args[0] == other and other.is_real: return S.true return Ge(self, other, evaluate=False)
class frac(Function): r"""Represents the fractional part of x
For real numbers it is defined [1]_ as
.. math:: x - \lfloor{x}\rfloor
Examples ========
>>> from sympy import Symbol, frac, Rational, floor, ceiling, I >>> frac(Rational(4, 3)) 1/3 >>> frac(-Rational(4, 3)) 2/3
returns zero for integer arguments
>>> n = Symbol('n', integer=True) >>> frac(n) 0
rewrite as floor
>>> x = Symbol('x') >>> frac(x).rewrite(floor) x - floor(x)
for complex arguments
>>> r = Symbol('r', real=True) >>> t = Symbol('t', real=True) >>> frac(t + I*r) I*frac(r) + frac(t)
See Also ========
sympy.functions.elementary.integers.floor sympy.functions.elementary.integers.ceiling
References ===========
.. [1] http://en.wikipedia.org/wiki/Fractional_part .. [2] http://mathworld.wolfram.com/FractionalPart.html
""" @classmethod def eval(cls, arg): from sympy import AccumBounds, im
def _eval(arg): if arg is S.Infinity or arg is S.NegativeInfinity: return AccumBounds(0, 1) if arg.is_integer: return S.Zero if arg.is_number: if arg is S.NaN: return S.NaN elif arg is S.ComplexInfinity: return None else: return arg - floor(arg) return cls(arg, evaluate=False)
terms = Add.make_args(arg) real, imag = S.Zero, S.Zero for t in terms: # Two checks are needed for complex arguments # see issue-7649 for details if t.is_imaginary or (S.ImaginaryUnit*t).is_real: i = im(t) if not i.has(S.ImaginaryUnit): imag += i else: real += t else: real += t
real = _eval(real) imag = _eval(imag) return real + S.ImaginaryUnit*imag
def _eval_rewrite_as_floor(self, arg): return arg - floor(arg) |