]> www.ginac.de Git - cln.git/blob - src/real/transcendental/cl_R_log.cc
Initial revision
[cln.git] / src / real / transcendental / cl_R_log.cc
1 // log().
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_N.h"
13 #include "cl_R.h"
14 #include "cl_rational.h"
15 #include "cl_float.h"
16
17 const cl_R log (const cl_R& a, const cl_R& b)
18 {
19 // Methode:
20 // a und b rational:
21 //   b=1 -> Error
22 //   log(a,b) rational errechenbar -> liefern.
23 //   Sonst a und b in Floats umwandeln.
24 // a Float, b rational -> bei b=1 Error, sonst b := (float b a)
25 // a rational, b Float -> bei a=1 Ergebnis 0, sonst a := (float a b)
26 // a,b Floats -> log(a,b) = ln(a)/ln(b)
27  {      Mutable(cl_R,a);
28         Mutable(cl_R,b);
29         if (rationalp(b)) {
30                 // b rational
31                 if (eq(b,1)) { cl_error_division_by_0(); }
32                 if (rationalp(a)) {
33                         // a,b beide rational
34                         var cl_RA l;
35                         if (logp(The(cl_RA)(a),The(cl_RA)(b),&l))
36                                 return l;
37                         // a,b beide in Floats umwandeln:
38                         a = cl_float(The(cl_RA)(a)); b = cl_float(The(cl_RA)(b));
39                 } else
40                         // a Float
41                         b = cl_float(The(cl_RA)(b),The(cl_F)(a)); // b := (float b a)
42         } else {
43                 // b Float
44                 if (rationalp(a)) {
45                         if (eq(a,1)) { return 0; } // a=1 -> Ergebnis 0
46                         a = cl_float(The(cl_RA)(a),The(cl_F)(b)); // a := (float a b)
47                 }
48         }
49         // Nun a,b beide Floats.
50         return ln(The(cl_F)(a)) / ln(The(cl_F)(b));
51 }}