/[GiNaC]/ginac/numeric.h
ViewVC logotype

Diff of /ginac/numeric.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8 by kreckel, Mon Nov 22 15:26:18 1999 UTC revision 1.21 by cbauer, Thu Jan 27 15:26:13 2000 UTC
# Line 3  Line 3 
3   *  Makes the interface to the underlying bignum package available. */   *  Makes the interface to the underlying bignum package available. */
4    
5  /*  /*
6   *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany   *  GiNaC Copyright (C) 1999-2000 Johannes Gutenberg University Mainz, Germany
7   *   *
8   *  This program is free software; you can redistribute it and/or modify   *  This program is free software; you can redistribute it and/or modify
9   *  it under the terms of the GNU General Public License as published by   *  it under the terms of the GNU General Public License as published by
# Line 24  Line 24 
24  #define __GINAC_NUMERIC_H__  #define __GINAC_NUMERIC_H__
25    
26  #include <strstream>  #include <strstream>
27  #include <ginac/basic.h>  #include "basic.h"
28  #include <ginac/ex.h>  #include "ex.h"
29    
30  class cl_N;     // We want to include cln.h only in numeric.cpp in order to  class cl_N;     // We want to include cln.h only in numeric.cpp in order to
31                  // avoid namespace pollution and keep compile-time low.                  // avoid namespace pollution and keep compile-time low.
32    
33    #ifndef NO_GINAC_NAMESPACE
34  namespace GiNaC {  namespace GiNaC {
35    #endif // ndef NO_GINAC_NAMESPACE
36    
37  #define HASHVALUE_NUMERIC 0x80000001U  #define HASHVALUE_NUMERIC 0x80000001U
38    
# Line 61  private: Line 63  private:
63   *  hierarchy. Objects of this type may directly be created by the user.*/   *  hierarchy. Objects of this type may directly be created by the user.*/
64  class numeric : public basic  class numeric : public basic
65  {  {
66        GINAC_DECLARE_REGISTERED_CLASS(numeric, basic)
67    
68  // friends  // friends
69      friend numeric exp(numeric const & x);      friend const numeric exp(const numeric & x);
70      friend numeric log(numeric const & x);      friend const numeric log(const numeric & x);
71      friend numeric sin(numeric const & x);      friend const numeric sin(const numeric & x);
72      friend numeric cos(numeric const & x);      friend const numeric cos(const numeric & x);
73      friend numeric tan(numeric const & x);      friend const numeric tan(const numeric & x);
74      friend numeric asin(numeric const & x);      friend const numeric asin(const numeric & x);
75      friend numeric acos(numeric const & x);      friend const numeric acos(const numeric & x);
76      friend numeric atan(numeric const & x);      friend const numeric atan(const numeric & x);
77      friend numeric atan(numeric const & y, numeric const & x);      friend const numeric atan(const numeric & y, const numeric & x);
78      friend numeric sinh(numeric const & x);      friend const numeric sinh(const numeric & x);
79      friend numeric cosh(numeric const & x);      friend const numeric cosh(const numeric & x);
80      friend numeric tanh(numeric const & x);      friend const numeric tanh(const numeric & x);
81      friend numeric asinh(numeric const & x);      friend const numeric asinh(const numeric & x);
82      friend numeric acosh(numeric const & x);      friend const numeric acosh(const numeric & x);
83      friend numeric atanh(numeric const & x);      friend const numeric atanh(const numeric & x);
84      friend numeric bernoulli(numeric const & n);      friend const numeric zeta(const numeric & x);
85      friend numeric abs(numeric const & x);      friend const numeric bernoulli(const numeric & n);
86      friend numeric mod(numeric const & a, numeric const & b);      friend numeric abs(const numeric & x);
87      friend numeric smod(numeric const & a, numeric const & b);      friend numeric mod(const numeric & a, const numeric & b);
88      friend numeric irem(numeric const & a, numeric const & b);      friend numeric smod(const numeric & a, const numeric & b);
89      friend numeric irem(numeric const & a, numeric const & b, numeric & q);      friend numeric irem(const numeric & a, const numeric & b);
90      friend numeric iquo(numeric const & a, numeric const & b);      friend numeric irem(const numeric & a, const numeric & b, numeric & q);
91      friend numeric iquo(numeric const & a, numeric const & b, numeric & r);      friend numeric iquo(const numeric & a, const numeric & b);
92      friend numeric sqrt(numeric const & x);      friend numeric iquo(const numeric & a, const numeric & b, numeric & r);
93      friend numeric isqrt(numeric const & x);      friend numeric sqrt(const numeric & x);
94      friend numeric gcd(numeric const & a, numeric const & b);      friend numeric isqrt(const numeric & x);
95      friend numeric lcm(numeric const & a, numeric const & b);      friend numeric gcd(const numeric & a, const numeric & b);
96      friend numeric const & numZERO(void);      friend numeric lcm(const numeric & a, const numeric & b);
     friend numeric const & numONE(void);  
     friend numeric const & numTWO(void);  
     friend numeric const & numTHREE(void);  
     friend numeric const & numMINUSONE(void);  
     friend numeric const & numHALF(void);  
97    
98  // member functions  // member functions
99    
# Line 103  class numeric : public basic Line 102  class numeric : public basic
102  public:  public:
103      numeric();      numeric();
104      ~numeric();      ~numeric();
105      numeric(numeric const & other);      numeric(const numeric & other);
106      numeric const & operator=(numeric const & other);      const numeric & operator=(const numeric & other);
107  protected:  protected:
108      void copy(numeric const & other);      void copy(const numeric & other);
109      void destroy(bool call_parent);      void destroy(bool call_parent);
110    
111      // other constructors      // other constructors
# Line 117  public: Line 116  public:
116      explicit numeric(unsigned long i);      explicit numeric(unsigned long i);
117      explicit numeric(long numer, long denom);      explicit numeric(long numer, long denom);
118      explicit numeric(double d);      explicit numeric(double d);
119      explicit numeric(char const *);      explicit numeric(const char *);
120      numeric(cl_N const & z);      numeric(cl_N const & z);
121    
122      // functions overriding virtual functions from bases classes      // functions overriding virtual functions from bases classes
123  public:  public:
124      basic * duplicate() const;      basic * duplicate() const;
125        void print(ostream & os, unsigned precedence=0) const;
126      void printraw(ostream & os) const;      void printraw(ostream & os) const;
127      void printtree(ostream & os, unsigned indent) const;      void printtree(ostream & os, unsigned indent) const;
     void print(ostream & os, unsigned precedence=0) const;  
128      void printcsrc(ostream & os, unsigned type, unsigned precedence=0) const;      void printcsrc(ostream & os, unsigned type, unsigned precedence=0) const;
129      bool info(unsigned inf) const;      bool info(unsigned inf) const;
130      ex evalf(int level=0) const;      ex evalf(int level=0) const;
131      ex diff(symbol const & s) const;      ex diff(const symbol & s) const;
132      ex normal(lst &sym_lst, lst &repl_lst, int level=0) const;      ex normal(lst &sym_lst, lst &repl_lst, int level=0) const;
133      numeric integer_content(void) const;      numeric integer_content(void) const;
134      ex smod(numeric const &xi) const;      ex smod(const numeric &xi) const;
135      numeric max_coefficient(void) const;      numeric max_coefficient(void) const;
136  protected:  protected:
137      int compare_same_type(basic const & other) const;      int compare_same_type(const basic & other) const;
138      bool is_equal_same_type(basic const & other) const;      bool is_equal_same_type(const basic & other) const;
139      unsigned calchash(void) const {      unsigned calchash(void) const {
140          hashvalue=HASHVALUE_NUMERIC;          hashvalue=HASHVALUE_NUMERIC;
141          return HASHVALUE_NUMERIC;          return HASHVALUE_NUMERIC;
# Line 147  protected: Line 146  protected:
146    
147      // non-virtual functions in this class      // non-virtual functions in this class
148  public:  public:
149      numeric add(numeric const & other) const;      numeric add(const numeric & other) const;
150      numeric sub(numeric const & other) const;      numeric sub(const numeric & other) const;
151      numeric mul(numeric const & other) const;      numeric mul(const numeric & other) const;
152      numeric div(numeric const & other) const;      numeric div(const numeric & other) const;
153      numeric power(numeric const & other) const;      numeric power(const numeric & other) const;
154      numeric const & add_dyn(numeric const & other) const;      const numeric & add_dyn(const numeric & other) const;
155      numeric const & sub_dyn(numeric const & other) const;      const numeric & sub_dyn(const numeric & other) const;
156      numeric const & mul_dyn(numeric const & other) const;      const numeric & mul_dyn(const numeric & other) const;
157      numeric const & div_dyn(numeric const & other) const;      const numeric & div_dyn(const numeric & other) const;
158      numeric const & power_dyn(numeric const & other) const;      const numeric & power_dyn(const numeric & other) const;
159      numeric const & operator=(int i);      const numeric & operator=(int i);
160      numeric const & operator=(unsigned int i);      const numeric & operator=(unsigned int i);
161      numeric const & operator=(long i);      const numeric & operator=(long i);
162      numeric const & operator=(unsigned long i);      const numeric & operator=(unsigned long i);
163      numeric const & operator=(double d);      const numeric & operator=(double d);
164      numeric const & operator=(char const * s);      const numeric & operator=(const char * s);
     /*  
     numeric add_dyn(numeric const & other) const   { return add(other);   }  
     numeric sub_dyn(numeric const & other) const   { return sub(other);   }  
     numeric mul_dyn(numeric const & other) const   { return mul(other);   }  
     numeric div_dyn(numeric const & other) const   { return div(other);   }  
     numeric power_dyn(numeric const & other) const { return power(other); }  
     */  
165      numeric inverse(void) const;      numeric inverse(void) const;
166      int csgn(void) const;      int csgn(void) const;
167      int compare(numeric const & other) const;      int compare(const numeric & other) const;
168      bool is_equal(numeric const & other) const;      bool is_equal(const numeric & other) const;
169      bool is_zero(void) const;      bool is_zero(void) const;
170      bool is_positive(void) const;      bool is_positive(void) const;
171      bool is_negative(void) const;      bool is_negative(void) const;
# Line 185  public: Line 177  public:
177      bool is_prime(void) const;      bool is_prime(void) const;
178      bool is_rational(void) const;      bool is_rational(void) const;
179      bool is_real(void) const;      bool is_real(void) const;
180      bool operator==(numeric const & other) const;      bool is_cinteger(void) const;
181      bool operator!=(numeric const & other) const;      bool is_crational(void) const;
182      bool operator<(numeric const & other) const;      bool operator==(const numeric & other) const;
183      bool operator<=(numeric const & other) const;      bool operator!=(const numeric & other) const;
184      bool operator>(numeric const & other) const;      bool operator<(const numeric & other) const;
185      bool operator>=(numeric const & other) const;      bool operator<=(const numeric & other) const;
186        bool operator>(const numeric & other) const;
187        bool operator>=(const numeric & other) const;
188      int to_int(void) const;      int to_int(void) const;
189        long to_long(void) const;
190      double to_double(void) const;      double to_double(void) const;
191      numeric real(void) const;      numeric real(void) const;
192      numeric imag(void) const;      numeric imag(void) const;
# Line 210  protected: Line 205  protected:
205    
206  extern const numeric some_numeric;  extern const numeric some_numeric;
207  extern const numeric I;  extern const numeric I;
208  extern type_info const & typeid_numeric;  extern const type_info & typeid_numeric;
209  extern _numeric_digits Digits;  extern _numeric_digits Digits;
210    
211  #define is_a_numeric_hash(x) ((x)==HASHVALUE_NUMERIC)  #define is_a_numeric_hash(x) ((x)==HASHVALUE_NUMERIC)
# Line 218  extern _numeric_digits Digits; Line 213  extern _numeric_digits Digits;
213    
214  // global functions  // global functions
215    
216  numeric const & numZERO(void);  const numeric exp(const numeric & x);
217  numeric const & numONE(void);  const numeric log(const numeric & x);
218  numeric const & numTWO(void);  const numeric sin(const numeric & x);
219  numeric const & numMINUSONE(void);  const numeric cos(const numeric & x);
220  numeric const & numHALF(void);  const numeric tan(const numeric & x);
221    const numeric asin(const numeric & x);
222  numeric exp(numeric const & x);  const numeric acos(const numeric & x);
223  numeric log(numeric const & x);  const numeric atan(const numeric & x);
224  numeric sin(numeric const & x);  const numeric atan(const numeric & y, const numeric & x);
225  numeric cos(numeric const & x);  const numeric sinh(const numeric & x);
226  numeric tan(numeric const & x);  const numeric cosh(const numeric & x);
227  numeric asin(numeric const & x);  const numeric tanh(const numeric & x);
228  numeric acos(numeric const & x);  const numeric asinh(const numeric & x);
229  numeric atan(numeric const & x);  const numeric acosh(const numeric & x);
230  numeric atan(numeric const & y, numeric const & x);  const numeric atanh(const numeric & x);
231  numeric sinh(numeric const & x);  const numeric zeta(const numeric & x);
232  numeric cosh(numeric const & x);  const numeric gamma(const numeric & x);
233  numeric tanh(numeric const & x);  const numeric psi(const numeric & x);
234  numeric asinh(numeric const & x);  const numeric psi(const numeric & n, const numeric & x);
235  numeric acosh(numeric const & x);  const numeric factorial(const numeric & n);
236  numeric atanh(numeric const & x);  const numeric doublefactorial(const numeric & n);
237  numeric zeta(numeric const & x);  const numeric binomial(const numeric & n, const numeric & k);
238  numeric gamma(numeric const & x);  const numeric bernoulli(const numeric & n);
239  numeric psi(numeric const & n, numeric const & x);  const numeric fibonacci(const numeric & n);
240  numeric factorial(numeric const & n);  
241  numeric doublefactorial(numeric const & n);  numeric abs(const numeric & x);
242  numeric binomial(numeric const & n, numeric const & k);  numeric mod(const numeric & a, const numeric & b);
243  numeric bernoulli(numeric const & n);  numeric smod(const numeric & a, const numeric & b);
244    numeric irem(const numeric & a, const numeric & b);
245  numeric abs(numeric const & x);  numeric irem(const numeric & a, const numeric & b, numeric & q);
246  numeric mod(numeric const & a, numeric const & b);  numeric iquo(const numeric & a, const numeric & b);
247  numeric smod(numeric const & a, numeric const & b);  numeric iquo(const numeric & a, const numeric & b, numeric & r);
248  numeric irem(numeric const & a, numeric const & b);  numeric sqrt(const numeric & x);
249  numeric irem(numeric const & a, numeric const & b, numeric & q);  numeric isqrt(const numeric & x);
 numeric iquo(numeric const & a, numeric const & b);  
 numeric iquo(numeric const & a, numeric const & b, numeric & r);  
 numeric sqrt(numeric const & x);  
 numeric isqrt(numeric const & x);  
250    
251  numeric gcd(numeric const & a, numeric const & b);  numeric gcd(const numeric & a, const numeric & b);
252  numeric lcm(numeric const & a, numeric const & b);  numeric lcm(const numeric & a, const numeric & b);
253    
254  /** Exception thrown by numeric members to signal failure */  /** Exception thrown by numeric members to signal failure */
255  struct numeric_fail  struct numeric_fail
# Line 268  struct numeric_fail Line 259  struct numeric_fail
259  };  };
260    
261  // wrapper functions around member functions  // wrapper functions around member functions
262  inline numeric inverse(numeric const & x)  inline numeric pow(const numeric & x, const numeric & y)
263    { return x.power(y); }
264    
265    inline numeric inverse(const numeric & x)
266  { return x.inverse(); }  { return x.inverse(); }
267    
268  inline bool csgn(numeric const & x)  inline bool csgn(const numeric & x)
269  { return x.csgn(); }  { return x.csgn(); }
270    
271  inline bool is_zero(numeric const & x)  inline bool is_zero(const numeric & x)
272  { return x.is_zero(); }  { return x.is_zero(); }
273    
274  inline bool is_positive(numeric const & x)  inline bool is_positive(const numeric & x)
275  { return x.is_positive(); }  { return x.is_positive(); }
276    
277  inline bool is_integer(numeric const & x)  inline bool is_integer(const numeric & x)
278  { return x.is_integer(); }  { return x.is_integer(); }
279    
280  inline bool is_pos_integer(numeric const & x)  inline bool is_pos_integer(const numeric & x)
281  { return x.is_pos_integer(); }  { return x.is_pos_integer(); }
282    
283  inline bool is_nonneg_integer(numeric const & x)  inline bool is_nonneg_integer(const numeric & x)
284  { return x.is_nonneg_integer(); }  { return x.is_nonneg_integer(); }
285    
286  inline bool is_even(numeric const & x)  inline bool is_even(const numeric & x)
287  { return x.is_even(); }  { return x.is_even(); }
288    
289  inline bool is_odd(numeric const & x)  inline bool is_odd(const numeric & x)
290  { return x.is_odd(); }  { return x.is_odd(); }
291    
292  inline bool is_prime(numeric const & x)  inline bool is_prime(const numeric & x)
293  { return x.is_prime(); }  { return x.is_prime(); }
294    
295  inline bool is_rational(numeric const & x)  inline bool is_rational(const numeric & x)
296  { return x.is_rational(); }  { return x.is_rational(); }
297    
298  inline bool is_real(numeric const & x)  inline bool is_real(const numeric & x)
299  { return x.is_real(); }  { return x.is_real(); }
300    
301  inline numeric real(numeric const & x)  inline bool is_cinteger(const numeric & x)
302    { return x.is_cinteger(); }
303    
304    inline bool is_crational(const numeric & x)
305    { return x.is_crational(); }
306    
307    inline numeric real(const numeric & x)
308  { return x.real(); }  { return x.real(); }
309    
310  inline numeric imag(numeric const & x)  inline numeric imag(const numeric & x)
311  { return x.imag(); }  { return x.imag(); }
312    
313  inline numeric numer(numeric const & x)  inline numeric numer(const numeric & x)
314  { return x.numer(); }  { return x.numer(); }
315    
316  inline numeric denom(numeric const & x)  inline numeric denom(const numeric & x)
317  { return x.denom(); }  { return x.denom(); }
318    
319  /* do we need this any more? */  // numeric evaluation functions for class constant objects:
 //inline numeric factorial(int n)  
 //{ return factorial(numeric(n)); }  
   
 /* do we need this any more? */  
 //inline numeric binomial(int n, int k)  
 //{ return binomial(numeric(n), numeric(k)); }  
320    
 ex IEvalf(void);  
321  ex PiEvalf(void);  ex PiEvalf(void);
322  ex EulerGammaEvalf(void);  ex EulerGammaEvalf(void);
323  ex CatalanEvalf(void);  ex CatalanEvalf(void);
# Line 335  inline const numeric &ex_to_numeric(cons Line 328  inline const numeric &ex_to_numeric(cons
328          return static_cast<const numeric &>(*e.bp);          return static_cast<const numeric &>(*e.bp);
329  }  }
330    
331    #ifndef NO_GINAC_NAMESPACE
332  } // namespace GiNaC  } // namespace GiNaC
333    #endif // ndef NO_GINAC_NAMESPACE
334    
335  #endif // ndef __GINAC_NUMERIC_H__  #endif // ndef __GINAC_NUMERIC_H__

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.21

Christian Bauer">Christian Bauer
ViewVC Help
Powered by ViewVC 1.1.15