summaryrefslogtreecommitdiffstats
path: root/src/svg/round.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/svg/round.cpp
downloadinkscape-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.cpp47
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);
+}
+