16 #define MAYBE_INLINE inline
17 #include "cl_LF_minusp.cc"
19 cl_signean cl_compare (const cl_LF& x, const cl_LF& y)
22 // x und y haben verschiedenes Vorzeichen ->
25 // x und y haben gleiches Vorzeichen ->
26 // x >=0 -> vergleiche x und y (die rechten 24 Bits)
27 // x <0 -> vergleiche y und x (die rechten 24 Bits)
32 { // Vergleiche Exponenten und Mantissen:
33 { var uintL x_uexp = TheLfloat(x)->expo;
34 var uintL y_uexp = TheLfloat(y)->expo;
35 if (x_uexp < y_uexp) return signean_minus; // x<y
36 if (x_uexp > y_uexp) return signean_plus; // x>y
38 { var uintC x_len = TheLfloat(x)->len;
39 var uintC y_len = TheLfloat(y)->len;
40 var uintC len = (x_len<y_len ? x_len : y_len); // min(x_len,y_len)
41 // len Digits vergleichen:
43 compare_loop_msp(arrayMSDptr(TheLfloat(x)->data,x_len),arrayMSDptr(TheLfloat(y)->data,y_len),len);
44 if (!(erg==0)) { return erg; } // verschieden -> fertig
45 // gemeinsames Teilstück war gleich
46 if (x_len == y_len) { return signean_null; } // gleiche Länge -> fertig
49 { if (DS_test_loop(arrayMSDptr(TheLfloat(x)->data,x_len) mspop y_len,x_len-y_len,arrayLSDptr(TheLfloat(x)->data,x_len)))
50 { return signean_plus; } // x>y
52 { return signean_null; }
56 { if (DS_test_loop(arrayMSDptr(TheLfloat(y)->data,y_len) mspop x_len,y_len-x_len,arrayLSDptr(TheLfloat(y)->data,y_len)))
57 { return signean_minus; } // x<y
59 { return signean_null; }
64 { return signean_minus; } // x<y
69 { return signean_plus; } // x>y
72 { // Vergleiche Exponenten und Mantissen:
73 { var uintL x_uexp = TheLfloat(x)->expo;
74 var uintL y_uexp = TheLfloat(y)->expo;
75 if (x_uexp < y_uexp) return signean_plus; // |x|<|y| -> x>y
76 if (x_uexp > y_uexp) return signean_minus; // |x|>|y| -> x<y
78 { var uintC x_len = TheLfloat(x)->len;
79 var uintC y_len = TheLfloat(y)->len;
80 var uintC len = (x_len<y_len ? x_len : y_len); // min(x_len,y_len)
81 // len Digits vergleichen:
83 compare_loop_msp(arrayMSDptr(TheLfloat(y)->data,y_len),arrayMSDptr(TheLfloat(x)->data,x_len),len);
84 if (!(erg==0)) { return erg; } // verschieden -> fertig
85 // gemeinsames Teilstück war gleich
86 if (x_len == y_len) { return signean_null; } // gleiche Länge -> fertig
89 { if (DS_test_loop(arrayMSDptr(TheLfloat(x)->data,x_len) mspop y_len,x_len-y_len,arrayLSDptr(TheLfloat(x)->data,x_len)))
90 { return signean_minus; } // |x|>|y| -> x<y
92 { return signean_null; }
96 { if (DS_test_loop(arrayMSDptr(TheLfloat(y)->data,y_len) mspop x_len,y_len-x_len,arrayLSDptr(TheLfloat(y)->data,y_len)))
97 { return signean_plus; } // |x|<|y| -> x>y
99 { return signean_null; }