]> www.ginac.de Git - cln.git/blob - src/integer/division/cl_I_round2.cc
bfa24c17a151a748cae9d0fe8ffa95390801001f
[cln.git] / src / integer / division / cl_I_round2.cc
1 // round2().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_integer.h"
8
9
10 // Implementation.
11
12 #include "cl_I.h"
13
14 const cl_I_div_t round2 (const cl_I& x, const cl_I& y)
15 {
16 // Methode:
17 // (round x y) :==
18 // (DIVIDE (abs x) (abs y)) -> q,r
19 // Setze s:=abs(y)-r.
20 // Falls (r>s) oder (r=s und q ungerade),
21 //   (d.h. falls r>abs(y)/2 oder r=abs(y)/2 und q ungerade),
22 //   setze q:=q+1 und r:=-s (d.h. r:=r-abs(y)).
23 // {Nun ist abs(r) <= abs(y)/2, bei abs(r)=abs(y)/2 ist q gerade.}
24 // Falls x<0, setze r:=-r.
25 // Falls x,y verschiedene Vorzeichen haben, setze q:=-q.
26 // Liefere q,r.
27   var cl_I abs_y = abs(y);
28   var cl_I_div_t q_r = cl_divide(abs(x),abs_y);
29   var cl_I& q = q_r.quotient;
30   var cl_I& r = q_r.remainder;
31   var cl_I s = abs_y - r;
32   if ((r > s) || ((r == s) && oddp(q)))
33     { q = q + 1; r = - s; }
34   if (minusp(x))
35     { r = -r; }
36   if (minusp(x) != minusp(y))
37     { q = -q; }
38   return q_r;
39 }