from __future__ import annotations import warnings from cupy import _core from cupy._core import fusion from cupy._math import ufunc from cupy._util import bf16_loop def around(a, decimals=0, out=None): """Rounds to the given number of decimals. Args: a (cupy.ndarray): The source array. decimals (int): Number of decimal places to round to (default: 0). If decimals is negative, it specifies the number of positions to the left of the decimal point. out (cupy.ndarray): Output array. Returns: cupy.ndarray: Rounded array. .. seealso:: :func:`numpy.around` """ if fusion._is_fusing(): return fusion._call_ufunc( _core.core._round_ufunc, a, decimals, out=out) a = _core.array(a, copy=False) return a.round(decimals, out=out) def round(a, decimals=0, out=None): return around(a, decimals, out=out) def round_(a, decimals=0, out=None): warnings.warn('Please use `round` instead.', DeprecationWarning) return around(a, decimals, out=out) rint = ufunc.create_math_ufunc( 'rint', 1, 'cupy_rint', '''Rounds each element of an array to the nearest integer. .. seealso:: :data:`numpy.rint` ''') def create_rounding_ufunc(name, op, doc): return _core.create_ufunc( name, ( "?->?", "b->b", "B->B", "h->h", "H->H", "i->i", "I->I", "l->l", "L->L", "q->q", "Q->Q", ("e->e", op), *bf16_loop(code=op), ("f->f", op), ("d->d", op), ), "out0 = in0", doc=doc, ) floor = create_rounding_ufunc( "cupy_floor", "out0 = floor(in0)", """Rounds each element of an array to its floor integer. .. seealso:: :data:`numpy.floor` """, ) ceil = create_rounding_ufunc( "cupy_ceil", "out0 = ceil(in0)", """Rounds each element of an array to its ceiling integer. .. seealso:: :data:`numpy.ceil` """, ) trunc = create_rounding_ufunc( "cupy_trunc", "out0 = trunc(in0)", """Rounds each element of an array towards zero. .. seealso:: :data:`numpy.trunc` """, ) fix = create_rounding_ufunc( "cupy_fix", "out0 = (in0 >= 0.0) ? floor(in0): ceil(in0)", """If given value x is positive, it return floor(x). Else, it return ceil(x). .. seealso:: :func:`numpy.fix` """, )