diff options
Diffstat (limited to 'src/svg/round.cpp')
| -rw-r--r-- | src/svg/round.cpp | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/svg/round.cpp b/src/svg/round.cpp new file mode 100644 index 000000000..9e7b91e4e --- /dev/null +++ b/src/svg/round.cpp @@ -0,0 +1,47 @@ +///////////////////////////////////////////////////////////////////////// +// ftos.cc +// +// Copyright (c) 1996-2003 Bryce W. Harrington [bryce at osdl dot org] +// +//----------------------------------------------------------------------- +// License: This code may be used by anyone for any purpose +// so long as the copyright notices and this license +// statement remains attached. +//----------------------------------------------------------------------- +// This routine rounds a double using the "rounding rule", as expressed +// in _Advanced Engineering Mathematics_ by Erwin Kreyszig, 6th ed., +// John Wiley & Sons, Inc., 1988, page 945. +// +// Discard the (k+1)th and all subsequent decimals. +// (a) If the number thus discarded is less than half a unit in the +// kth place, leave the kth decimal unchanged ("rounding down") +// (b) If it is greater than half a unit in the kth place, add one +// to the kth decimal ("rounding up") +// (c) If it is exactly half a unit, round off to the nearest *even* +// decimal. +// Example: Rounding off 3.45 and 3.55 by one decimal gives 3.4 and +// 3.6, respectively. +// Rule (c) is to ensure that in discarding exactly half a decimal, +// rounding up and rounding down happens about equally often, +// on the average. +/////////////////////////////////////////////////////////////////////// +#include <math.h> + +double rround(double x) +{ + double xlow = floor(x); + if (x - xlow != 0.5000) + return floor(x + 0.5000); + else if ( floor(x/2.0) == xlow/2.0) + return xlow; + else + return xlow++; +} + +// This version allows rounding to a specific digit +double rround(double x, int k) +{ + if (k==0) return rround(x); + else return rround(x*pow(10,k)) / pow(10,k); +} + |
