]> www.ginac.de Git - cln.git/blob - src/float/sfloat/elem/cl_SF_compare.cc
d6c022cb723f365d539ef757887782c53104b0b9
[cln.git] / src / float / sfloat / elem / cl_SF_compare.cc
1 // cl_compare().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_sfloat.h"
8
9
10 // Implementation.
11
12 #undef MAYBE_INLINE
13 #define MAYBE_INLINE inline
14 #include "cl_SF_minusp.cc"
15
16 cl_signean cl_compare (const cl_SF& x, const cl_SF& y)
17 {
18 // Methode:
19 // x und y haben verschiedenes Vorzeichen ->
20 //    x < 0 -> x < y
21 //    x >= 0 -> x > y
22 // x und y haben gleiches Vorzeichen ->
23 //    x >=0 -> vergleiche x und y (die rechten 24 Bits)
24 //    x <0 -> vergleiche y und x (die rechten 24 Bits)
25       if (!minusp(y))
26         // y>=0
27         { if (!minusp(x))
28             // y>=0, x>=0
29             { if (x.word < y.word) return signean_minus; // x<y
30               if (x.word > y.word) return signean_plus; // x>y
31               return signean_null;
32             }
33             else
34             // y>=0, x<0
35             { return signean_minus; } // x<y
36         }
37         else
38         { if (!minusp(x))
39             // y<0, x>=0
40             { return signean_plus; } // x>y
41             else
42             // y<0, x<0
43             { if (x.word > y.word) return signean_minus; // |x|>|y| -> x<y
44               if (x.word < y.word) return signean_plus; // |x|<|y| -> x>y
45               return signean_null;
46             }
47         }
48 }