flopscope.numpy.round
flopscope.numpy.round(a, decimals=0, out=None)[flopscope source]
Evenly round to the given number of decimals.
Parameters
- a:array_like
Input data.
- decimals:int, optional
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:ndarray, optional
Alternative output array in which to place the result. It must have the same shape as the expected output, but the type of the output values will be cast if necessary. See ufuncs-output-type for more details.
Returns
- rounded_array:ndarray
An array of the same type as
a, containing the rounded values. Unlessoutwas specified, a new array is created. A reference to the result is returned.The real and imaginary parts of complex numbers are rounded separately. The result of rounding a float is a float.
See also
- ndarray.round equivalent method
- we.flops.rint an alias for this function
- we.flops.ceil
- we.flops.trunc
- we.flops.floor
- we.flops.rint
- we.flops.trunc
Notes
For values exactly halfway between rounded decimal values, NumPy rounds to the nearest even value. Thus 1.5 and 2.5 round to 2.0, -0.5 and 0.5 round to 0.0, etc.
flops.round uses a fast but sometimes inexact algorithm to round
floating-point datatypes. For positive decimals it is equivalent to
flops.true_divide(flops.rint(a * 10**decimals), 10**decimals), which has
error due to the inexact representation of decimal fractions in the IEEE
floating point standard [1]_ and errors introduced when scaling by powers
of ten. For instance, note the extra "1" in the following:
>>> flops.round(56294995342131.5, 3)
56294995342131.51If your goal is to print such values with a fixed number of decimals, it is preferable to use numpy's float printing routines to limit the number of printed decimals:
>>> flops.format_float_positional(56294995342131.5, precision=3)
'56294995342131.5'The float printing routines use an accurate but much more computationally demanding algorithm to compute the number of digits after the decimal point.
Alternatively, Python's builtin round function uses a more accurate but slower algorithm for 64-bit floating point values:
>>> round(56294995342131.5, 3)
56294995342131.5
>>> flops.round(16.055, 2), round(16.055, 2) # equals 16.0549999999999997
(16.06, 16.05)References
1
"Lecture Notes on the Status of IEEE 754", William Kahan,
https://people.eecs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDFExamples
>>> import flopscope.numpy as fnp
>>> flops.round([0.37, 1.64])
array([0., 2.])
>>> flops.round([0.37, 1.64], decimals=1)
array([0.4, 1.6])
>>> flops.round([.5, 1.5, 2.5, 3.5, 4.5]) # rounds to nearest even value
array([0., 2., 2., 4., 4.])
>>> flops.round([1,2,3,11], decimals=1) # ndarray of ints is returned
array([ 1, 2, 3, 11])
>>> flops.round([1,2,3,11], decimals=-1)
array([ 0, 0, 0, 10])