diff options
| author | MenTaLguY <mental@rydia.net> | 2006-01-16 02:36:01 +0000 |
|---|---|---|
| committer | mental <mental@users.sourceforge.net> | 2006-01-16 02:36:01 +0000 |
| commit | 179fa413b047bede6e32109e2ce82437c5fb8d34 (patch) | |
| tree | a5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/svg/round.cpp | |
| download | inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip | |
moving trunk for module inkscape
(bzr r1)
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); +} + |
