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

Diff of /ginac/numeric.h

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

revision 1.3 by cbauer, Wed Nov 10 19:35:49 1999 UTC revision 1.18 by cbauer, Wed Jan 19 19:46:57 2000 UTC
# Line 1  Line 1 
1  /** @file numeric.h  /** @file numeric.h
2   *   *
3   *  Makes the interface to the underlying bignum package available.   *  Makes the interface to the underlying bignum package available. */
4   *  
5   *  GiNaC Copyright (C) 1999 Johannes Gutenberg University Mainz, Germany  /*
6     *  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 25 
25    
26  #include <strstream>  #include <strstream>
27  #include <ginac/basic.h>  #include <ginac/basic.h>
28    #include <ginac/ex.h>
 #define HASHVALUE_NUMERIC 0x80000001U  
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 {
35    #endif // ndef NO_GINAC_NAMESPACE
36    
37    #define HASHVALUE_NUMERIC 0x80000001U
38    
39  /** This class is used to instantiate a global object Digits which  /** This class is used to instantiate a global object Digits which
40   *  behaves just like Maple's Digits.  We need an object rather than a   *  behaves just like Maple's Digits.  We need an object rather than a
41   *  dumber basic type since as a side-effect we let it change   *  dumber basic type since as a side-effect we let it change
# Line 57  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 numeric exp(const numeric & x);
70      friend numeric log(numeric const & x);      friend numeric log(const numeric & x);
71      friend numeric sin(numeric const & x);      friend numeric sin(const numeric & x);
72      friend numeric cos(numeric const & x);      friend numeric cos(const numeric & x);
73      friend numeric tan(numeric const & x);      friend numeric tan(const numeric & x);
74      friend numeric asin(numeric const & x);      friend numeric asin(const numeric & x);
75      friend numeric acos(numeric const & x);      friend numeric acos(const numeric & x);
76      friend numeric atan(numeric const & x);      friend numeric atan(const numeric & x);
77      friend numeric atan(numeric const & y, numeric const & x);      friend numeric atan(const numeric & y, const numeric & x);
78      friend numeric sinh(numeric const & x);      friend numeric sinh(const numeric & x);
79      friend numeric cosh(numeric const & x);      friend numeric cosh(const numeric & x);
80      friend numeric tanh(numeric const & x);      friend numeric tanh(const numeric & x);
81      friend numeric asinh(numeric const & x);      friend numeric asinh(const numeric & x);
82      friend numeric acosh(numeric const & x);      friend numeric acosh(const numeric & x);
83      friend numeric atanh(numeric const & x);      friend numeric atanh(const numeric & x);
84      friend numeric abs(numeric const & x);      friend numeric zeta(const numeric & x);
85      friend numeric mod(numeric const & a, numeric const & b);      friend numeric bernoulli(const numeric & n);
86      friend numeric smod(numeric const & a, numeric const & b);      friend numeric abs(const numeric & x);
87      friend numeric irem(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, numeric & q);      friend numeric smod(const numeric & a, const numeric & b);
89      friend numeric iquo(numeric const & a, numeric const & b);      friend numeric irem(const numeric & a, const numeric & b);
90      friend numeric iquo(numeric const & a, numeric const & b, numeric & r);      friend numeric irem(const numeric & a, const numeric & b, numeric & q);
91      friend numeric sqrt(numeric const & x);      friend numeric iquo(const numeric & a, const numeric & b);
92      friend numeric isqrt(numeric const & x);      friend numeric iquo(const numeric & a, const numeric & b, numeric & r);
93      friend numeric gcd(numeric const & a, numeric const & b);      friend numeric sqrt(const numeric & x);
94      friend numeric lcm(numeric const & a, numeric const & b);      friend numeric isqrt(const numeric & x);
95      friend numeric const & numZERO(void);      friend numeric gcd(const numeric & a, const numeric & b);
96      friend numeric const & numONE(void);      friend numeric lcm(const numeric & a, const numeric & b);
     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 98  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 118  public: Line 122  public:
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(symbol const & 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(basic const & other) const;
# Line 142  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=(char const * 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 compare(numeric const & other) const;      int csgn(void) const;
167      bool is_equal(numeric const & other) const;      int compare(const numeric & other) const;
168        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 179  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      double to_double(void) const;      double to_double(void) const;
190      numeric real(void) const;      numeric real(void) const;
# Line 212  extern _numeric_digits Digits; Line 212  extern _numeric_digits Digits;
212    
213  // global functions  // global functions
214    
215  numeric const & numZERO(void);  numeric exp(const numeric & x);
216  numeric const & numONE(void);  numeric log(const numeric & x);
217  numeric const & numTWO(void);  numeric sin(const numeric & x);
218  numeric const & numMINUSONE(void);  numeric cos(const numeric & x);
219  numeric const & numHALF(void);  numeric tan(const numeric & x);
220    numeric asin(const numeric & x);
221  numeric exp(numeric const & x);  numeric acos(const numeric & x);
222  numeric log(numeric const & x);  numeric atan(const numeric & x);
223  numeric sin(numeric const & x);  numeric atan(const numeric & y, const numeric & x);
224  numeric cos(numeric const & x);  numeric sinh(const numeric & x);
225  numeric tan(numeric const & x);  numeric cosh(const numeric & x);
226  numeric asin(numeric const & x);  numeric tanh(const numeric & x);
227  numeric acos(numeric const & x);  numeric asinh(const numeric & x);
228  numeric atan(numeric const & x);  numeric acosh(const numeric & x);
229  numeric atan(numeric const & y, numeric const & x);  numeric atanh(const numeric & x);
230  numeric sinh(numeric const & x);  numeric zeta(const numeric & x);
231  numeric cosh(numeric const & x);  numeric gamma(const numeric & x);
232  numeric tanh(numeric const & x);  numeric psi(const numeric & x);
233  numeric asinh(numeric const & x);  numeric psi(const numeric & n, const numeric & x);
234  numeric acosh(numeric const & x);  numeric factorial(const numeric & n);
235  numeric atanh(numeric const & x);  numeric doublefactorial(const numeric & n);
236  numeric gamma(numeric const & x);  numeric binomial(const numeric & n, const numeric & k);
237  numeric factorial(numeric const & n);  numeric bernoulli(const numeric & n);
238  numeric doublefactorial(numeric const & n);  
239  numeric binomial(numeric const & n, numeric const & k);  numeric abs(const numeric & x);
240    numeric mod(const numeric & a, const numeric & b);
241  numeric abs(numeric const & x);  numeric smod(const numeric & a, const numeric & b);
242  numeric mod(numeric const & a, numeric const & b);  numeric irem(const numeric & a, const numeric & b);
243  numeric smod(numeric const & a, numeric const & b);  numeric irem(const numeric & a, const numeric & b, numeric & q);
244  numeric irem(numeric const & a, numeric const & b);  numeric iquo(const numeric & a, const numeric & b);
245  numeric irem(numeric const & a, numeric const & b, numeric & q);  numeric iquo(const numeric & a, const numeric & b, numeric & r);
246  numeric iquo(numeric const & a, numeric const & b);  numeric sqrt(const numeric & x);
247  numeric iquo(numeric const & a, numeric const & b, numeric & r);  numeric isqrt(const numeric & x);
 numeric sqrt(numeric const & x);  
 numeric isqrt(numeric const & x);  
248    
249  numeric gcd(numeric const & a, numeric const & b);  numeric gcd(const numeric & a, const numeric & b);
250  numeric lcm(numeric const & a, numeric const & b);  numeric lcm(const numeric & a, const numeric & b);
251    
252  /** Exception thrown by numeric members to signal failure */  /** Exception thrown by numeric members to signal failure */
253  struct numeric_fail  struct numeric_fail
# Line 259  struct numeric_fail Line 257  struct numeric_fail
257  };  };
258    
259  // wrapper functions around member functions  // wrapper functions around member functions
260  inline numeric inverse(numeric const & x)  inline numeric pow(const numeric & x, const numeric & y)
261    { return x.power(y); }
262    
263    inline numeric inverse(const numeric & x)
264  { return x.inverse(); }  { return x.inverse(); }
265    
266  inline bool is_zero(numeric const & x)  inline bool csgn(const numeric & x)
267    { return x.csgn(); }
268    
269    inline bool is_zero(const numeric & x)
270  { return x.is_zero(); }  { return x.is_zero(); }
271    
272  inline bool is_positive(numeric const & x)  inline bool is_positive(const numeric & x)
273  { return x.is_positive(); }  { return x.is_positive(); }
274    
275  inline bool is_integer(numeric const & x)  inline bool is_integer(const numeric & x)
276  { return x.is_integer(); }  { return x.is_integer(); }
277    
278  inline bool is_pos_integer(numeric const & x)  inline bool is_pos_integer(const numeric & x)
279  { return x.is_pos_integer(); }  { return x.is_pos_integer(); }
280    
281  inline bool is_nonneg_integer(numeric const & x)  inline bool is_nonneg_integer(const numeric & x)
282  { return x.is_nonneg_integer(); }  { return x.is_nonneg_integer(); }
283    
284  inline bool is_even(numeric const & x)  inline bool is_even(const numeric & x)
285  { return x.is_even(); }  { return x.is_even(); }
286    
287  inline bool is_odd(numeric const & x)  inline bool is_odd(const numeric & x)
288  { return x.is_odd(); }  { return x.is_odd(); }
289    
290  inline bool is_prime(numeric const & x)  inline bool is_prime(const numeric & x)
291  { return x.is_prime(); }  { return x.is_prime(); }
292    
293  inline bool is_rational(numeric const & x)  inline bool is_rational(const numeric & x)
294  { return x.is_rational(); }  { return x.is_rational(); }
295    
296  inline bool is_real(numeric const & x)  inline bool is_real(const numeric & x)
297  { return x.is_real(); }  { return x.is_real(); }
298    
299  inline numeric real(numeric const & x)  inline bool is_cinteger(const numeric & x)
300    { return x.is_cinteger(); }
301    
302    inline bool is_crational(const numeric & x)
303    { return x.is_crational(); }
304    
305    inline numeric real(const numeric & x)
306  { return x.real(); }  { return x.real(); }
307    
308  inline numeric imag(numeric const & x)  inline numeric imag(const numeric & x)
309  { return x.imag(); }  { return x.imag(); }
310    
311  inline numeric numer(numeric const & x)  inline numeric numer(const numeric & x)
312  { return x.numer(); }  { return x.numer(); }
313    
314  inline numeric denom(numeric const & x)  inline numeric denom(const numeric & x)
315  { return x.denom(); }  { return x.denom(); }
316    
317  /* 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)); }  
318    
 ex IEvalf(void);  
319  ex PiEvalf(void);  ex PiEvalf(void);
320  ex EulerGammaEvalf(void);  ex EulerGammaEvalf(void);
321  ex CatalanEvalf(void);  ex CatalanEvalf(void);
322    
323  #define ex_to_numeric(X) static_cast<numeric const &>(*(X).bp)  // utility functions
324    inline const numeric &ex_to_numeric(const ex &e)
325    {
326        return static_cast<const numeric &>(*e.bp);
327    }
328    
329    #ifndef NO_GINAC_NAMESPACE
330    } // namespace GiNaC
331    #endif // ndef NO_GINAC_NAMESPACE
332    
333  #endif // ndef __GINAC_NUMERIC_H__  #endif // ndef __GINAC_NUMERIC_H__

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.18

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