7 #include "cln/rational.h"
13 #include "cln/integer.h"
17 cl_signean compare (const cl_RA& r, const cl_RA& s)
20 // r,s Integer -> klar
23 // r Integer, s Ratio: r=a, s=b/c. Vergleiche a*c und b.
24 // r Ratio, s Integer: r=a/b, s=c. Vergleiche a und b*c.
25 // r,s Ratios: r=a/b, s=c/d. Vergleiche a*d und b*c.
26 // 1. Schritt: Test, ob beides Integers:
27 if (integerp(r) && integerp(s)) {
32 // r,s nicht beide Integers.
33 // 2. Schritt: Test, ob die Vorzeichen bereits das Ergebnis hergeben:
36 return signean_minus; // r<0, s>=0 -> r<s
39 return signean_plus; // r>=0, s<0 -> r>s
41 // r,s haben gleiches Vorzeichen.
42 // 3. Schritt: Fallunterscheidung nach Typen
46 // r Integer, s Ratio: r=a, s=b/c. Vergleiche a*c und b.
47 var const cl_I& a = r;
48 var const cl_I& b = numerator(s);
49 var const cl_I& c = denominator(s);
50 return compare(a*c,b);
55 // r Ratio, s Integer: r=a/b, s=c. Vergleiche a und b*c.
56 var const cl_I& a = numerator(r);
57 var const cl_I& b = denominator(r);
58 var const cl_I& c = s;
59 return compare(a,b*c);
64 // r,s Ratios: r=a/b, s=c/d. Vergleiche a*d und b*c.
65 var const cl_I& a = numerator(r);
66 var const cl_I& b = denominator(r);
67 var const cl_I& c = numerator(s);
68 var const cl_I& d = denominator(s);
69 return compare(a*d,b*c);
72 // Beschleunigung durch Konversion zu Short-Floats diese zuerst vergleichen??