knumber_priv.h

00001 /* This file is part of the KDE libraries
00002     Copyright (C) 2005 Klaus Niederkrueger <kniederk@math.uni-koeln.de>
00003 
00004     This library is free software; you can redistribute it and/or
00005     modify it under the terms of the GNU Library General Public
00006     License as published by the Free Software Foundation; either
00007     version 2 of the License, or (at your option) any later version.
00008 
00009     This library is distributed in the hope that it will be useful,
00010     but WITHOUT ANY WARRANTY; without even the implied warranty of
00011     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012     Library General Public License for more details.
00013 
00014     You should have received a copy of the GNU Library General Public License
00015     along with this library; see the file COPYING.LIB.  If not, write to
00016     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
00017     Boston, MA 02110-1301, USA.
00018 */
00019 #ifndef _KNUMBER_PRIV_H
00020 #define _KNUMBER_PRIV_H
00021 
00022 class QString;
00023 
00024 #include <gmp.h>
00025 
00026 // work-around for pre-C99-libs
00027 #ifndef INFINITY
00028 #define INFINITY  HUGE_VAL
00029 #endif
00030 // this is really ugly
00031 #ifndef NAN
00032 #define NAN (atof("nan"))
00033 #endif
00034 
00035 class _knumber
00036 {
00037  public:
00038   enum NumType {SpecialType, IntegerType, FractionType, FloatType};
00039   enum ErrorType {UndefinedNumber, Infinity, MinusInfinity};
00040 
00041   _knumber() {}
00042 
00043   virtual ~_knumber() {}
00044 
00045   virtual void copy(_knumber const & num) = 0;
00046 
00047   virtual NumType type(void) const = 0;
00048 
00049   virtual QString const ascii(int prec = -1) const = 0;
00050 
00051   virtual _knumber * abs(void) const = 0;
00052   virtual _knumber * intPart(void) const = 0;
00053   virtual int sign(void) const = 0;
00054   virtual _knumber * sqrt(void) const = 0;
00055   virtual _knumber * cbrt(void) const = 0;
00056   virtual _knumber * change_sign(void) const = 0;
00057   virtual _knumber * reciprocal(void) const = 0;
00058   virtual _knumber * add(_knumber const & arg2) const = 0;
00059   virtual _knumber * multiply(_knumber const & arg2) const = 0;
00060   _knumber * divide(_knumber const & arg2) const;
00061 
00062   virtual _knumber * power(_knumber const & exponent) const = 0;
00063 
00064   virtual int compare(_knumber const &arg2) const = 0;
00065 
00066   virtual operator signed long int (void) const = 0;
00067   virtual operator unsigned long int (void) const = 0;
00068   virtual operator double (void) const = 0;
00069 };
00070 
00071 
00072 
00073 class _knumerror : public _knumber
00074 {
00075  public:
00076   _knumerror(ErrorType error = UndefinedNumber)
00077     : _error(error) { }
00078   
00079   _knumerror(_knumber const & num);
00080 
00081   _knumerror(const QString & num);
00082 
00083   //virtual ~_knumerror() { }
00084 
00085   _knumerror const & operator = (_knumerror const & num);
00086 
00087   virtual void copy(_knumber const & num)
00088   {
00089     _error = dynamic_cast<_knumerror const &>(num)._error;
00090   }
00091 
00092   virtual NumType type(void) const {return SpecialType;}
00093 
00094   virtual QString const ascii(int prec = -1) const;
00095 
00096   virtual _knumber * abs(void) const;
00097   virtual _knumber * intPart(void) const;
00098   virtual int sign(void) const;
00099   virtual _knumber * cbrt(void) const;
00100   virtual _knumber * sqrt(void) const;
00101   virtual _knumber * change_sign(void) const;
00102   virtual _knumber * reciprocal(void) const;
00103   virtual _knumber * add(_knumber const & arg2) const;
00104   virtual _knumber * multiply(_knumber const & arg2) const;
00105 
00106   virtual _knumber * power(_knumber const & exponent) const;
00107 
00108   virtual int compare(_knumber const &arg2) const;
00109 
00110   virtual operator signed long int (void) const;
00111   virtual operator unsigned long int (void) const;
00112   virtual operator double (void) const;
00113 
00114  private:
00115 
00116   ErrorType _error;
00117 
00118   friend class _knuminteger;
00119   friend class _knumfraction;
00120   friend class _knumfloat;
00121 };
00122 
00123 
00124 
00125 class _knuminteger : public _knumber
00126 {
00127  public:
00128   _knuminteger(signed int num = 0)
00129   {
00130     mpz_init_set_si(_mpz, num);
00131   }
00132 
00133   _knuminteger(unsigned int num)
00134   {
00135     mpz_init_set_ui(_mpz, num);
00136   }
00137 
00138   _knuminteger(signed long int num)
00139   {
00140     mpz_init_set_si(_mpz, num);
00141   }
00142 
00143   _knuminteger(unsigned long int num)
00144   {
00145     mpz_init_set_ui(_mpz, num);
00146   }
00147   
00148   _knuminteger(unsigned long long int num);
00149 
00150   _knuminteger(_knumber const & num);
00151 
00152   _knuminteger(const QString & num);
00153 
00154   virtual ~_knuminteger()
00155   {
00156     mpz_clear(_mpz);
00157   }
00158 
00159   _knuminteger const & operator = (_knuminteger const & num);
00160 
00161   virtual void copy(_knumber const & num)
00162   {
00163     mpz_set(_mpz, dynamic_cast<_knuminteger const &>(num)._mpz);
00164   }
00165 
00166   virtual NumType type(void) const {return IntegerType;}
00167 
00168   virtual QString const ascii(int prec = -1) const;
00169 
00170   virtual _knumber * abs(void) const;
00171   virtual _knumber * intPart(void) const;
00172   virtual int sign(void) const;
00173   virtual _knumber * cbrt(void) const;
00174   virtual _knumber * sqrt(void) const;
00175   virtual _knumber * change_sign(void) const;
00176   virtual _knumber * reciprocal(void) const;
00177   virtual _knumber * add(_knumber const & arg2) const;
00178   virtual _knumber * multiply(_knumber const & arg2) const;
00179 
00180   virtual int compare(_knumber const &arg2) const;
00181 
00182   virtual _knumber * power(_knumber const & exponent) const;
00183 
00184   virtual operator signed long int (void) const;
00185   virtual operator unsigned long int (void) const;
00186   virtual operator double (void) const;
00187 
00188   _knuminteger * intAnd(_knuminteger const &arg2) const;
00189   _knuminteger * intOr(_knuminteger const &arg2) const;
00190   _knumber * mod(_knuminteger const &arg2) const;
00191   _knumber * shift(_knuminteger const &arg2) const;
00192   
00193  private:
00194   mpz_t _mpz;
00195 
00196   friend class _knumfraction;
00197   friend class _knumfloat;
00198 };
00199 
00200 
00201 
00202 class _knumfraction : public _knumber
00203 {
00204  public:
00205   
00206   _knumfraction(signed long int nom = 0, signed long int denom = 1)
00207   {
00208     mpq_init(_mpq);
00209     mpq_set_si(_mpq, nom, denom);
00210     mpq_canonicalize(_mpq);
00211   }
00212 
00213   _knumfraction(_knumber const & num);
00214   
00215   _knumfraction(QString const & num);
00216 
00217   virtual ~_knumfraction()
00218   {
00219     mpq_clear(_mpq);
00220   }
00221   
00222   virtual void copy(_knumber const & num)
00223   {
00224     mpq_set(_mpq, dynamic_cast<_knumfraction const &>(num)._mpq);
00225   }
00226 
00227   virtual NumType type(void) const {return FractionType;}
00228 
00229   virtual QString const ascii(int prec = -1) const;
00230   
00231   bool isInteger(void) const;
00232 
00233   virtual _knumber * abs(void) const;
00234   virtual _knumber * intPart(void) const;
00235   virtual int sign(void) const;
00236   virtual _knumber * cbrt(void) const;
00237   virtual _knumber * sqrt(void) const;
00238   virtual _knumber * change_sign(void) const;
00239   virtual _knumber * reciprocal(void) const;
00240   virtual _knumber * add(_knumber const & arg2) const;
00241   virtual _knumber * multiply(_knumber const & arg2) const;
00242 
00243   virtual _knumber * power(_knumber const & exponent) const;
00244   
00245   virtual int compare(_knumber const &arg2) const;
00246 
00247   virtual operator signed long int (void) const;
00248   virtual operator unsigned long int (void) const;
00249   virtual operator double (void) const;
00250 
00251  private:
00252   mpq_t _mpq;
00253 
00254   friend class _knuminteger;
00255   friend class _knumfloat;
00256 };
00257 
00258 class _knumfloat : public _knumber
00259 {
00260  public:
00261   _knumfloat(double num = 1.0)
00262   {
00263     mpf_init(_mpf);
00264     mpf_set_d(_mpf, num);
00265   }
00266   
00267   _knumfloat(_knumber const & num);
00268 
00269   _knumfloat(QString const & num);
00270   
00271   virtual ~_knumfloat()
00272   {
00273     mpf_clear(_mpf);
00274   }
00275 
00276   virtual void copy(_knumber const & num)
00277   {
00278     mpf_set(_mpf, dynamic_cast<_knumfloat const &>(num)._mpf);
00279   }
00280 
00281   virtual NumType type(void) const {return FloatType;}
00282 
00283   virtual QString const ascii(int prec = -1) const;
00284 
00285   virtual _knumber * abs(void) const;
00286   virtual _knumber * intPart(void) const;
00287   virtual int sign(void) const;
00288   virtual _knumber * cbrt(void) const;
00289   virtual _knumber * sqrt(void) const;
00290   virtual _knumber * change_sign(void) const;
00291   virtual _knumber * reciprocal(void) const;
00292   virtual _knumber * add(_knumber const & arg2) const;
00293   virtual _knumber * multiply(_knumber const & arg2) const;
00294   virtual _knumber * divide(_knumber const & arg2) const;
00295 
00296   virtual _knumber * power(_knumber const & exponent) const;
00297 
00298   virtual int compare(_knumber const &arg2) const;
00299 
00300   virtual operator signed long int (void) const;
00301   virtual operator unsigned long int (void) const;
00302   virtual operator double (void) const;
00303 
00304  private:
00305     mpf_t _mpf;
00306 
00307   friend class _knuminteger;
00308   friend class _knumfraction;
00309 };
00310 
00311 
00312 #endif //  _KNUMBER_PRIV_H
KDE Home | KDE Accessibility Home | Description of Access Keys