]> www.ginac.de Git - cln.git/blob - src/rational/elem/cl_RA_compare.cc
1716020503fc8e39664c87f486db2bc8565f451f
[cln.git] / src / rational / elem / cl_RA_compare.cc
1 // cl_compare().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_rational.h"
8
9
10 // Implementation.
11
12 #include "cl_RA.h"
13 #include "cl_integer.h"
14
15 cl_signean cl_compare (const cl_RA& r, const cl_RA& s)
16 {
17 // Methode:
18 // r,s Integer -> klar
19 // r<0, s>=0 -> r<s.
20 // r>=0, s<0 -> r>s.
21 // r Integer, s Ratio: r=a, s=b/c. Vergleiche a*c und b.
22 // r Ratio, s Integer: r=a/b, s=c. Vergleiche a und b*c.
23 // r,s Ratios: r=a/b, s=c/d. Vergleiche a*d und b*c.
24         // 1. Schritt: Test, ob beides Integers:
25         if (integerp(r) && integerp(s)) {
26                 DeclareType(cl_I,r);
27                 DeclareType(cl_I,s);
28                 return cl_compare(r,s);
29         }
30         // r,s nicht beide Integers.
31         // 2. Schritt: Test, ob die Vorzeichen bereits das Ergebnis hergeben:
32         if (minusp(r)) {
33                 if (!minusp(s))
34                         return signean_minus; // r<0, s>=0 -> r<s
35         } else {
36                 if (minusp(s))
37                         return signean_plus; // r>=0, s<0 -> r>s
38         }
39         // r,s haben gleiches Vorzeichen.
40         // 3. Schritt: Fallunterscheidung nach Typen
41         if (integerp(r)) {
42                 DeclareType(cl_I,r);
43                 DeclareType(cl_RT,s);
44                 // r Integer, s Ratio: r=a, s=b/c. Vergleiche a*c und b.
45                 var const cl_I& a = r;
46                 var const cl_I& b = numerator(s);
47                 var const cl_I& c = denominator(s);
48                 return cl_compare(a*c,b);
49         }
50         elif (integerp(s)) {
51                 DeclareType(cl_I,s);
52                 DeclareType(cl_RT,r);
53                 // r Ratio, s Integer: r=a/b, s=c. Vergleiche a und b*c.
54                 var const cl_I& a = numerator(r);
55                 var const cl_I& b = denominator(r);
56                 var const cl_I& c = s;
57                 return cl_compare(a,b*c);
58         }
59         else {
60                 DeclareType(cl_RT,r);
61                 DeclareType(cl_RT,s);
62                 // r,s Ratios: r=a/b, s=c/d. Vergleiche a*d und b*c.
63                 var const cl_I& a = numerator(r);
64                 var const cl_I& b = denominator(r);
65                 var const cl_I& c = numerator(s);
66                 var const cl_I& d = denominator(s);
67                 return cl_compare(a*d,b*c);
68         }
69 }
70 // Beschleunigung durch Konversion zu Short-Floats diese zuerst vergleichen??