]> www.ginac.de Git - cln.git/blob - src/float/ffloat/elem/cl_FF_compare.cc
0e6fce8f8b3da8abd0636d2110548feab3385739
[cln.git] / src / float / ffloat / elem / cl_FF_compare.cc
1 // cl_compare().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_ffloat.h"
8
9
10 // Implementation.
11
12 #include "cl_FF.h"
13
14 cl_signean cl_compare (const cl_FF& x, const cl_FF& y)
15 {
16 // Methode:
17 // x und y haben verschiedenes Vorzeichen ->
18 //    x < 0 -> x < y
19 //    x >= 0 -> x > y
20 // x und y haben gleiches Vorzeichen ->
21 //    x >=0 -> vergleiche x und y (die rechten 24 Bits)
22 //    x <0 -> vergleiche y und x (die rechten 24 Bits)
23       var uint32 x_ = cl_ffloat_value(x);
24       var uint32 y_ = cl_ffloat_value(y);
25       if ((sint32)y_ >= 0)
26         // y>=0
27         { if ((sint32)x_ >= 0)
28             // y>=0, x>=0
29             { if (x_ < y_) return signean_minus; // x<y
30               if (x_ > y_) 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 ((sint32)x_ >= 0)
39             // y<0, x>=0
40             { return signean_plus; } // x>y
41             else
42             // y<0, x<0
43             { if (x_ > y_) return signean_minus; // |x|>|y| -> x<y
44               if (x_ < y_) return signean_plus; // |x|<|y| -> x>y
45               return signean_null;
46             }
47         }
48 }