]> www.ginac.de Git - cln.git/blob - src/real/elem/cl_R_equal.cc
Initial revision
[cln.git] / src / real / elem / cl_R_equal.cc
1 // cl_equal().
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 // Specification.
7 #include "cl_real.h"
8
9
10 // Implementation.
11
12 #include "cl_R.h"
13 #include "cl_RA.h"
14 #include "cl_integer.h"
15
16 inline cl_boolean cl_equal (const cl_F& x, const cl_F& y)
17 {
18         return (cl_boolean) (cl_compare(x,y) == 0);
19 }
20
21 cl_boolean cl_equal (const cl_R& x, const cl_R& y)
22 {
23 // Methode:
24 // Beide rational oder beide Floats -> klar.
25 // Eine rational, eine Float ->
26 //   Die rationale Zahl muß einen Zweierpotenz-Nenner haben, sonst verschieden.
27 //   Die rationale Zahl zum Float machen, vergleichen.
28 //   Verschieden -> Das war's.
29 //   Gleich -> Das Float mit RATIONAL rational machen, nochmals vergleichen.
30         realcase2(x
31         ,       realcase2(y
32                 ,       // beides rationale Zahlen
33                         return cl_equal(x,y);
34                 ,       // x rational, y Float -> x in Float umwandeln
35                         if (!power2p(denominator(x)))
36                                 return cl_false;
37                         if (!cl_equal(cl_float(x,y),y))
38                                 return cl_false;
39                         return cl_equal(x,rational(y));
40                 );
41         ,       realcase2(y
42                 ,       // x Float, y rational -> y in Float umwandeln
43                         if (!power2p(denominator(y)))
44                                 return cl_false;
45                         if (!cl_equal(x,cl_float(y,x)))
46                                 return cl_false;
47                         return cl_equal(rational(x),y);
48                 ,       // beides Floats
49                         return cl_equal(x,y);
50                 );
51         );
52 }