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