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     mpz_init(_mpz);
00151     mpz_set_ui(_mpz, static_cast<unsigned long int>(num >> 32));
00152     mpz_mul_2exp(_mpz, _mpz, 32);
00153     mpz_add_ui(_mpz, _mpz, static_cast<unsigned long int>(num));
00154   }
00155 
00156   _knuminteger(_knumber const & num);
00157 
00158   _knuminteger(const QString & num);
00159 
00160   virtual ~_knuminteger()
00161   {
00162     mpz_clear(_mpz);
00163   }
00164 
00165   _knuminteger const & operator = (_knuminteger const & num);
00166 
00167   virtual void copy(_knumber const & num)
00168   {
00169     mpz_set(_mpz, dynamic_cast<_knuminteger const &>(num)._mpz);
00170   }
00171 
00172   virtual NumType type(void) const {return IntegerType;}
00173 
00174   virtual QString const ascii(int prec = -1) const;
00175 
00176   virtual _knumber * abs(void) const;
00177   virtual _knumber * intPart(void) const;
00178   virtual int sign(void) const;
00179   virtual _knumber * cbrt(void) const;
00180   virtual _knumber * sqrt(void) const;
00181   virtual _knumber * change_sign(void) const;
00182   virtual _knumber * reciprocal(void) const;
00183   virtual _knumber * add(_knumber const & arg2) const;
00184   virtual _knumber * multiply(_knumber const & arg2) const;
00185 
00186   virtual int compare(_knumber const &arg2) const;
00187 
00188   virtual _knumber * power(_knumber const & exponent) const;
00189 
00190   virtual operator signed long int (void) const;
00191   virtual operator unsigned long int (void) const;
00192   virtual operator double (void) const;
00193 
00194   _knuminteger * intAnd(_knuminteger const &arg2) const;
00195   _knuminteger * intOr(_knuminteger const &arg2) const;
00196   _knumber * mod(_knuminteger const &arg2) const;
00197   _knumber * shift(_knuminteger const &arg2) const;
00198   
00199  private:
00200   mpz_t _mpz;
00201 
00202   friend class _knumfraction;
00203   friend class _knumfloat;
00204 };
00205 
00206 
00207 
00208 class _knumfraction : public _knumber
00209 {
00210  public:
00211   
00212   _knumfraction(signed long int nom = 0, signed long int denom = 1)
00213   {
00214     mpq_init(_mpq);
00215     mpq_set_si(_mpq, nom, denom);
00216     mpq_canonicalize(_mpq);
00217   }
00218 
00219   _knumfraction(_knumber const & num);
00220   
00221   _knumfraction(QString const & num);
00222 
00223   virtual ~_knumfraction()
00224   {
00225     mpq_clear(_mpq);
00226   }
00227   
00228   virtual void copy(_knumber const & num)
00229   {
00230     mpq_set(_mpq, dynamic_cast<_knumfraction const &>(num)._mpq);
00231   }
00232 
00233   virtual NumType type(void) const {return FractionType;}
00234 
00235   virtual QString const ascii(int prec = -1) const;
00236   
00237   bool isInteger(void) const;
00238 
00239   virtual _knumber * abs(void) const;
00240   virtual _knumber * intPart(void) const;
00241   virtual int sign(void) const;
00242   virtual _knumber * cbrt(void) const;
00243   virtual _knumber * sqrt(void) const;
00244   virtual _knumber * change_sign(void) const;
00245   virtual _knumber * reciprocal(void) const;
00246   virtual _knumber * add(_knumber const & arg2) const;
00247   virtual _knumber * multiply(_knumber const & arg2) const;
00248 
00249   virtual _knumber * power(_knumber const & exponent) const;
00250   
00251   virtual int compare(_knumber const &arg2) const;
00252 
00253   virtual operator signed long int (void) const;
00254   virtual operator unsigned long int (void) const;
00255   virtual operator double (void) const;
00256 
00257  private:
00258   mpq_t _mpq;
00259 
00260   friend class _knuminteger;
00261   friend class _knumfloat;
00262 };
00263 
00264 class _knumfloat : public _knumber
00265 {
00266  public:
00267   _knumfloat(double num = 1.0)
00268   {
00269     mpf_init(_mpf);
00270     mpf_set_d(_mpf, num);
00271   }
00272   
00273   _knumfloat(_knumber const & num);
00274 
00275   _knumfloat(QString const & num);
00276   
00277   virtual ~_knumfloat()
00278   {
00279     mpf_clear(_mpf);
00280   }
00281 
00282   virtual void copy(_knumber const & num)
00283   {
00284     mpf_set(_mpf, dynamic_cast<_knumfloat const &>(num)._mpf);
00285   }
00286 
00287   virtual NumType type(void) const {return FloatType;}
00288 
00289   virtual QString const ascii(int prec = -1) const;
00290 
00291   virtual _knumber * abs(void) const;
00292   virtual _knumber * intPart(void) const;
00293   virtual int sign(void) const;
00294   virtual _knumber * cbrt(void) const;
00295   virtual _knumber * sqrt(void) const;
00296   virtual _knumber * change_sign(void) const;
00297   virtual _knumber * reciprocal(void) const;
00298   virtual _knumber * add(_knumber const & arg2) const;
00299   virtual _knumber * multiply(_knumber const & arg2) const;
00300   virtual _knumber * divide(_knumber const & arg2) const;
00301 
00302   virtual _knumber * power(_knumber const & exponent) const;
00303 
00304   virtual int compare(_knumber const &arg2) const;
00305 
00306   virtual operator signed long int (void) const;
00307   virtual operator unsigned long int (void) const;
00308   virtual operator double (void) const;
00309 
00310  private:
00311     mpf_t _mpf;
00312 
00313   friend class _knuminteger;
00314   friend class _knumfraction;
00315 };
00316 
00317 
00318 #endif //  _KNUMBER_PRIV_H
KDE Home | KDE Accessibility Home | Description of Access Keys