Rounding
Rounding means replacing a number with an approximate value that has a shorter, simpler, or more explicit representation. For example, replacing $ with $, the fraction 312/937 with 1/3, or the expression with.
Rounding is often done to obtain a value that is easier to report and communicate than the original. Rounding can also be important to avoid misleadingly precise reporting of a computed number, measurement or estimate; for example, a quantity that was computed as but is known to be accurate only to within a few hundred units is usually better stated as "about ".
On the other hand, rounding of exact numbers will introduce some round-off error in the reported result. Rounding is almost unavoidable when reporting many computations – especially when dividing two numbers in integer or fixed-point arithmetic; when computing mathematical functions such as square roots, logarithms, and sines; or when using a floating-point representation with a fixed number of significant digits. In a sequence of calculations, these rounding errors generally accumulate, and in certain ill-conditioned cases they may make the result meaningless.
Accurate rounding of transcendental mathematical functions is difficult because the number of extra digits that need to be calculated to resolve whether to round up or down cannot be known in advance. This problem is known as "the table-maker's dilemma".
Rounding has many similarities to the quantization that occurs when physical quantities must be encoded by numbers or digital signals.
A wavy equals sign is sometimes used to indicate rounding of exact numbers, e.g., 9.98 ≈ 10. This sign was introduced by Alfred George Greenhill in 1892.
Ideal characteristics of rounding methods include:
- Rounding should be done by a function. This way, when the same input is rounded in different instances, the output is unchanged.
- Calculations done with rounding should be close to those done without rounding.
- * As a result of and, the output from rounding should be close to its input, often as close as possible by some metric.
- To be considered rounding, the range will be a subset of the domain. A classical range is the integers, Z.
- Rounding should preserve symmetries that already exist between the domain and range. With finite precision, this translates to removing bias.
- A rounding method should have utility in computer science or human arithmetic where finite precision is used, and speed is a consideration.
As a general rule, rounding is idempotent; i.e., once a number has been rounded, rounding it again will not change its value. Rounding functions are also monotonic; i.e., rounding a larger number results in the same or larger result than rounding the smaller number.
Types of rounding
Typical rounding problems include:Rounding to integer
The most basic form of rounding is to replace an arbitrary number by an integer. All the following rounding modes are concrete implementations of an abstract single-argument "round" procedure. These are true functions.Directed rounding to an integer
These four methods are called directed rounding, as the displacements from the original number to the rounded value are all directed towards or away from the same limiting value. Directed rounding is used in interval arithmetic and is often required in financial calculations.If is positive, round-down is the same as round-towards-zero, and round-up is the same as round-away-from-zero. If is negative, round-down is the same as round-away-from-zero, and round-up is the same as round-towards-zero. In any case, if is an integer, is just.
Where many calculations are done in sequence, the choice of rounding method can have a very significant effect on the result. A famous instance involved a new index set up by the Vancouver Stock Exchange in 1982. It was initially set at 1000.000, and after 22 months had fallen to about 520 — whereas stock prices had generally increased in the period. The problem was caused by the index being recalculated thousands of times daily, and always being rounded down to 3 decimal places, in such a way that the rounding errors accumulated. Recalculating with better rounding gave an index value of 1098.892 at the end of the same period.
For the examples below, refers to the sign function applied to the original number,.
Rounding down
- round down : is the largest integer that does not exceed.
- :
Rounding up
- round up : is the smallest integer that is not less than.
- :
Rounding towards zero
- round towards zero : is the integer that is closest to such that it is between 0 and ; i.e. is the integer part of, without its fraction digits.
- :
Rounding away from zero
- round away from zero : is the integer that is closest to 0 such that is between 0 and .
- :
Rounding to the nearest integer
If it were not for the 0.5 fractional parts, the round-off errors introduced by the round to nearest method would be symmetric: for every fraction that gets rounded down, there is a complementary fraction that gets rounded up by the same amount.
When rounding a large set of fixed-point numbers with uniformly distributed fractional parts, the rounding errors by all values, with the omission of those having 0.5 fractional part, would statistically compensate each other. This means that the expected value of the rounded numbers is equal to the expected value of the original numbers when we remove numbers with fractional part 0.5 from the set.
In practice, floating-point numbers are typically used, which have even more computational nuances because they are not equally spaced.
Round half up
The following tie-breaking rule, called round half up, is widely used in many disciplines. That is, half-way values of are always rounded up.- If the fraction of is exactly 0.5, then = + 0.5
- :
However, some programming languages define their half up as round half away from zero here.
This method only requires checking one digit to determine rounding direction in two's complement and similar representations.
Round half down
One may also use round half down as opposed to the more common round half up.- If the fraction of is exactly 0.5, then = − 0.5
- :
Round half towards zero
One may also round half towards zero as opposed to the conventional round half away from zero.- If the fraction of is exactly 0.5, then = − 0.5 if is positive, and = + 0.5 if is negative.
- :
This method treats positive and negative values symmetrically, and therefore is free of overall positive/negative bias if the original numbers are positive or negative with equal probability. It does, however, still have bias towards zero.
Round half away from zero
The other tie-breaking method commonly taught and used is the round half away from zero, namely:- If the fraction of is exactly 0.5, then = + 0.5 if is positive, and = − 0.5 if is negative.
- :
This can be more efficient on binary computers because only the first omitted bit needs to be considered to determine if it rounds up or down. This is one method used when rounding to significant figures due to its simplicity.
This method, also known as commercial rounding, treats positive and negative values symmetrically, and therefore is free of overall positive/negative bias if the original numbers are positive or negative with equal probability. It does, however, still have bias away from zero.
It is often used for currency conversions and price roundings as it is easy to explain by just considering the first fractional digit, independently of supplementary precision digits or sign of the amount.
Round half to even
A tie-breaking rule without positive/negative bias and without bias toward/away from zero is round half to even. By this convention, if the fractional part of is 0.5, then is the even integer nearest to. Thus, for example, +23.5 becomes +24, as does +24.5; while −23.5 becomes −24, as does −24.5. This function minimizes the expected error when summing over rounded figures, even when the inputs are mostly positive or mostly negative.This variant of the round-to-nearest method is also called convergent rounding, statistician's rounding, Dutch rounding, Gaussian rounding, odd–even rounding, or bankers' rounding.
This is the default rounding mode used in IEEE 754 floating-point operations, and used when rounding to significant figures.
By eliminating bias, repeated rounded addition or subtraction of independent numbers will give a result with an error that tends to grow in proportion to the square root of the number of operations rather than linearly. See random walk for more.
However, this rule distorts the distribution by increasing the probability of evens relative to odds. Typically this is less important than the biases that are eliminated by this method.
Round half to odd
A similar tie-breaking rule is round half to odd. In this approach, if the fraction of is 0.5, then is the odd integer nearest to. Thus, for example, +23.5 becomes +23, as does +22.5; while −23.5 becomes −23, as does −22.5.This method is also free from positive/negative bias and bias toward/away from zero.
This variant is almost never used in computations, except in situations where one wants to avoid increasing the scale of floating-point numbers, which have a limited exponent range. With round half to even, a non-infinite number would round to infinity, and a small value would round to a normal non-zero value. Effectively, this mode prefers preserving the existing scale of tie numbers, avoiding out-of-range results when possible for numeral systems of even radix.
Randomized rounding to an integer
Alternating tie-breaking
One method, more obscure than most, is to alternate direction when rounding a number with 0.5 fractional part. All others are rounded to the closest integer.- Whenever the fractional part is 0.5, alternate rounding up or down: for the first occurrence of a 0.5 fractional part, round up; for the second occurrence, round down; and so on.
Random tie-breaking
- If the fractional part of is 0.5, choose randomly among and, with equal probability. All others are rounded to the closest integer.
Stochastic rounding
Rounding as follows to one of the closest straddling integers with a probability dependent on the proximity is called stochastic rounding and will give an unbiased result on average.For example, 1.6 would be rounded to 1 with probability 0.4 and to 2 with probability 0.6.
Stochastic rounding is accurate in a way that a rounding function can never be. For example, say you started with 0 and added 0.3 to that one hundred times while rounding the running total between every addition. The result would be 0 with regular rounding, but with stochastic rounding, the expected result would be 30, which is the same value obtained without rounding. This can be useful in machine learning where the training may use low precision arithmetic iteratively. Stochastic rounding is a way to achieve 1-dimensional dithering.
Comparison of approaches for rounding to an integer
Rounding to other values
Rounding to a specified multiple
The most common type of rounding is to round to an integer; or, more generally, to an integer multiple of some increment — such as rounding to whole tenths of seconds, hundredths of a dollar, to whole multiples of 1/2 or 1/8 inch, to whole dozens or thousands, etc.In general, rounding a number to a multiple of some specified positive value entails the following steps:
For example, rounding = 2.1784 dollars to whole cents entails computing 2.1784 / 0.01 = 217.84, then rounding that to 218, and finally computing 218 × 0.01 = 2.18.
When rounding to a predetermined number of significant digits, the increment depends on the magnitude of the number to be rounded.
The increment is normally a finite fraction in whatever numeral system is used to represent the numbers. For display to humans, that usually means the decimal numeral system. For intermediate values stored in digital computers, it often means the binary numeral system.
The abstract single-argument "round" function that returns an integer from an arbitrary real value has at least a dozen distinct concrete definitions presented in the rounding to integer section. The abstract two-argument "roundToMultiple" function is formally defined here, but in many cases it is used with the implicit value = 1 for the increment and then reduces to the equivalent abstract single-argument function, with also the same dozen distinct concrete definitions.
Logarithmic rounding
Rounding to a specified power
Rounding to a specified power is very different from rounding to a specified multiple; for example, it is common in computing to need to round a number to a whole power of 2. The steps, in general, to round a positive number to a power of some specified integer greater than 1, are:Many of the caveats applicable to rounding to a multiple are applicable to rounding to a power.
[|Scaled rounding]
This type of rounding, which is also named rounding to a logarithmic scale, is a variant of [|rounding to a specified power]. Rounding on a logarithmic scale is accomplished by taking the log of the amount and doing normal rounding to the nearest value on the log scale.For example, resistors are supplied with preferred numbers on a logarithmic scale. In particular, for resistors with a 10% accuracy, they are supplied with nominal values 100, 120, 150, 180, 220, etc. rounded to multiples of 10. If a calculation indicates a resistor of 165 ohms is required then log = 2.176, log = 2.217 and log = 2.255. The logarithm of 165 is closer to the logarithm of 180 therefore a 180 ohm resistor would be the first choice if there are no other considerations.
Whether a value rounds to or depends upon whether the squared value is greater than or less than the product. The value 165 rounds to 180 in the resistors example because is greater than.
Floating-point rounding
In floating-point arithmetic, rounding aims to turn a given value into a value with a specified number of digits. In other words, should be a multiple of a number that depends on the magnitude of. The number is a power of the base of the floating-point representation.Apart from this detail, all the variants of rounding discussed above apply to the rounding of floating-point numbers as well. The algorithm for such rounding is presented in the Scaled rounding section above, but with a constant scaling factor = 1, and an integer base > 1.
Where the rounded result would overflow the result for a directed rounding is either the appropriate signed infinity when "rounding away from zero", or the highest representable positive finite number, when "rounding towards zero". The result of an overflow for the usual case of round to nearest is always the appropriate infinity.
Rounding to a simple fraction
In some contexts it is desirable to round a given number to a "neat" fraction — that is, the nearest fraction = / whose numerator and denominator do not exceed a given maximum. This problem is fairly distinct from that of rounding a value to a fixed number of decimal or binary digits, or to a multiple of a given unit. This problem is related to Farey sequences, the Stern–Brocot tree, and continued fractions.Rounding to an available value
Finished lumber, writing paper, capacitors, and many other products are usually sold in only a few standard sizes.Many design procedures describe how to calculate an approximate value, and then "round" to some standard size using phrases such as "round down to nearest standard value", "round up to nearest standard value", or "round to nearest standard value".
When a set of preferred values is equally spaced on a logarithmic scale, choosing the closest preferred value to any given value can be seen as a form of [|scaled rounding]. Such rounded values can be directly calculated.
Rounding in other contexts
Dithering and error diffusion
When digitizing continuous signals, such as sound waves, the overall effect of a number of measurements is more important than the accuracy of each individual measurement. In these circumstances, dithering, and a related technique, error diffusion, are normally used. A related technique called pulse-width modulation is used to achieve analog type output from an inertial device by rapidly pulsing the power with a variable duty cycle.Error diffusion tries to ensure the error, on average, is minimized. When dealing with a gentle slope from one to zero, the output would be zero for the first few terms until the sum of the error and the current value becomes greater than 0.5, in which case a 1 is output and the difference subtracted from the error so far. Floyd–Steinberg dithering is a popular error diffusion procedure when digitizing images.
As a one-dimensional example, suppose the numbers,,, and occur in order and each is to be rounded to a multiple of. In this case the cumulative sums,,,, and, are each rounded to a multiple of :,,, and. The first of these and the differences of adjacent values give the desired rounded values:,,, and.
Monte Carlo arithmetic
Monte Carlo arithmetic is a technique in Monte Carlo methods where the rounding is randomly up or down. Stochastic rounding can be used for Monte Carlo arithmetic, but in general, just rounding up or down with equal probability is more often used. Repeated runs will give a random distribution of results which can indicate the stability of the computation.Exact computation with rounded arithmetic
It is possible to use rounded arithmetic to evaluate the exact value of a function with integer domain and range. For example, if we know that an integer is a perfect square, we can compute its square root by converting to a floating-point value, computing the approximate square root of with floating point, and then rounding to the nearest integer. If is not too big, the floating-point round-off error in will be less than 0.5, so the rounded value will be the exact square root of. This is essentially why slide rules could be used for exact arithmetic.Double rounding
Rounding a number twice in succession to different levels of precision, with the latter precision being coarser, is not guaranteed to give the same result as rounding once to the final precision except in the case of directed rounding. For instance rounding 9.46 to one decimal gives 9.5, and then 10 when rounding to integer using rounding half to even, but would give 9 when rounded to integer directly. Borman and Chatfield discuss the implications of double rounding when comparing data rounded to one decimal place to specification limits expressed using integers.In Martinez v. Allstate and Sendejo v. Farmers, litigated between 1995 and 1997, the insurance companies argued that double rounding premiums was permissible and in fact required. The US courts ruled against the insurance companies and ordered them to adopt rules to ensure single rounding.
Some computer languages and the IEEE 754-2008 standard dictate that in straightforward calculations the result should not be rounded twice. This has been a particular problem with Java as it is designed to be run identically on different machines, special programming tricks have had to be used to achieve this with x87 floating point.
The Java language was changed to allow different results where the difference does not matter and require a strictfp qualifier to be used when the results have to conform accurately.
In some algorithms, an intermediate result is computed in a larger precision, then must be rounded to the final precision. Double rounding can be avoided by choosing an adequate rounding for the intermediate computation. This consists in avoiding to round to midpoints for the final rounding. In binary arithmetic, the idea is to round the result toward zero, and set the least significant bit to 1 if the rounded result is inexact; this rounding is called sticky rounding. Equivalently, it consists in returning the intermediate result when it is exactly representable, and the nearest floating-point number with an odd significand otherwise; this is why it is also known as rounding to odd.
Table-maker's dilemma
coined the term "The Table-Maker's Dilemma" for the unknown cost of rounding transcendental functions:"Nobody knows how much it would cost to compute correctly rounded for two floating-point arguments at which it does not over/underflow. Instead, reputable math libraries compute elementary transcendental functions mostly within slightly more than half an ulp and almost always well within one ulp. Why can't be rounded within half an ulp like SQRT? Because nobody knows how much computation it would cost... No general way exists to predict how many extra digits will have to be carried to compute a transcendental expression and round it to some preassigned number of digits. Even the fact that a finite number of extra digits will ultimately suffice may be a deep theorem."
The IEEE 754 floating-point standard guarantees that add, subtract, multiply, divide, fused multiply–add, square root, and floating-point remainder will give the correctly rounded result of the infinite-precision operation. No such guarantee was given in the 1985 standard for more complex functions and they are typically only accurate to within the last bit at best. However, the 2008 standard guarantees that conforming implementations will give correctly rounded results which respect the active rounding mode; implementation of the functions, however, is optional.
Using the Gelfond–Schneider theorem and Lindemann–Weierstrass theorem many of the standard elementary functions can be proved to return transcendental results when given rational non-zero arguments; therefore it is always possible to correctly round such functions. However, determining a limit for a given precision on how accurate results need to be computed, before a correctly rounded result can be guaranteed, may demand a lot of computation time or may be out of reach. In practice, when this limit is not known or too large, some decision has to be made in the implementation, but according to a probabilistic model, correct rounding can be satisfied with a very high probability.
Some programming packages offer correct rounding. The GNU MPFR package gives correctly rounded arbitrary precision results. Some other libraries implement elementary functions with correct rounding in double precision:
- IBM's libultim, in rounding to nearest only. This library uses up to 768 bits of working precision.
- Sun Microsystems's libmcr, in the 4 rounding modes. For the difficult cases, this library also uses multiple precision, and the number of words is increased by 2 each time the Table-maker's dilemma occurs.
- CRlibm, written in the old Arénaire team. It supports the 4 rounding modes and is proved.
Interaction with string searches
Rounding can adversely affect a string search for a number. For example, rounded to four digits is "3.1416" but a simple search for this string will not discover "3.14159" or any other value of rounded to more than four digits. In contrast, truncation does not suffer from this problem; for example, a simple string search for "3.1415", which is truncated to four digits, will discover values of truncated to more than four digits.History
The concept of rounding is very old, perhaps older even than the concept of division. Some ancient clay tablets found in Mesopotamia contain tables with rounded values of reciprocals and square roots in base 60.Rounded approximations to pi|, the length of the year, and the length of the month are also ancient—see base 60 examples.
The round-to-even method has served as the ASTM standard since 1940. The origin of the terms unbiased rounding and statistician's rounding are fairly self-explanatory. In the 1906 fourth edition of Probability and Theory of Errors Robert Simpson Woodward called this "the computer's rule" indicating that it was then in common use by human computers who calculated mathematical tables. Churchill Eisenhart indicated the practice was already "well established" in data analysis by the 1940s.
The origin of the term bankers' rounding remains more obscure. If this rounding method was ever a standard in banking, the evidence has proved extremely difficult to find. To the contrary, section 2 of the European Commission report The Introduction of the Euro and the Rounding of Currency Amounts suggests that there had previously been no standard approach to rounding in banking; and it specifies that "half-way" amounts should be rounded up.
Until the 1980s, the rounding method used in floating-point computer arithmetic was usually fixed by the hardware, poorly documented, inconsistent, and different for each brand and model of computer. This situation changed after the IEEE 754 floating-point standard was adopted by most computer manufacturers. The standard allows the user to choose among several rounding modes, and in each case specifies precisely how the results should be rounded. These features made numerical computations more predictable and machine-independent, and made possible the efficient and consistent implementation of interval arithmetic.
Currently, much research tends to round to multiples of 5 or 2. For example, Jörg Baten used age heaping in many studies, to evaluate the numeracy level of ancient populations. He came up with the ABCC Index, which enables the comparison of the numeracy among regions possible without any historical sources where the population literacy was measured.
Rounding functions in programming languages
Most programming languages provide functions or special syntax to round fractional numbers in various ways. The earliest numeric languages, such as FORTRAN and C, would provide only one method, usually truncation. This default method could be implied in certain contexts, such as when assigning a fractional number to an integer variable, or using a fractional number as an index of an array. Other kinds of rounding had to be programmed explicitly; for example, rounding a positive number to the nearest integer could be implemented by adding 0.5 and truncating.In the last decades, however, the syntax and/or the standard libraries of most languages have commonly provided at least the four basic rounding functions. The tie-breaking method may vary depending the language and version, and/or may be selectable by the programmer. Several languages follow the lead of the IEEE 754 floating-point standard, and define these functions as taking a double precision float argument and returning the result of the same type, which then may be converted to an integer if necessary. This approach may avoid spurious overflows because floating-point types have a larger range than integer types. Some languages, such as PHP, provide functions that round a value to a specified number of decimal digits, e.g. from 4321.5678 to 4321.57 or 4300. In addition, many languages provide a printf or similar string formatting function, which allows one to convert a fractional number to a string, rounded to a user-specified number of decimal places. On the other hand, truncation is still the default rounding method used by many languages, especially for the division of two integer values.
On the opposite, CSS and SVG do not define any specific maximum precision for numbers and measurements, that are treated and exposed in their DOM and in their IDL interface as strings as if they had infinite precision, and do not discriminate between integers and floating-point values; however, the implementations of these languages will typically convert these numbers into IEEE 754 double-precision floating-point values before exposing the computed digits with a limited precision.