• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kcalc/knumber
 

kcalc/knumber

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 TQString;
00023 
00024 #include <cstdio>
00025 #include <gmp.h>
00026 
00027 // work-around for pre-C99-libs
00028 #ifndef INFINITY
00029 #define INFINITY  HUGE_VAL
00030 #endif
00031 // this is really ugly
00032 #ifndef NAN
00033 #define NAN (atof("nan"))
00034 #endif
00035 
00036 class _knumber
00037 {
00038  public:
00039   enum NumType {SpecialType, IntegerType, FractionType, FloatType};
00040   enum ErrorType {UndefinedNumber, Infinity, MinusInfinity};
00041 
00042   _knumber() {}
00043 
00044   virtual ~_knumber() {}
00045 
00046   virtual void copy(_knumber const & num) = 0;
00047 
00048   virtual NumType type(void) const = 0;
00049 
00050   virtual TQString const ascii(int prec = -1) const = 0;
00051 
00052   virtual _knumber * abs(void) const = 0;
00053   virtual _knumber * intPart(void) const = 0;
00054   virtual int sign(void) const = 0;
00055   virtual _knumber * sqrt(void) const = 0;
00056   virtual _knumber * cbrt(void) const = 0;
00057   virtual _knumber * change_sign(void) const = 0;
00058   virtual _knumber * reciprocal(void) const = 0;
00059   virtual _knumber * add(_knumber const & arg2) const = 0;
00060   virtual _knumber * multiply(_knumber const & arg2) const = 0;
00061   _knumber * divide(_knumber const & arg2) const;
00062 
00063   virtual _knumber * power(_knumber const & exponent) const = 0;
00064 
00065   virtual int compare(_knumber const &arg2) const = 0;
00066 
00067   virtual operator signed long int (void) const = 0;
00068   virtual operator unsigned long int (void) const = 0;
00069   virtual operator double (void) const = 0;
00070 };
00071 
00072 
00073 
00074 class _knumerror : public _knumber
00075 {
00076  public:
00077   _knumerror(ErrorType error = UndefinedNumber)
00078     : _error(error) { }
00079   
00080   _knumerror(_knumber const & num);
00081 
00082   _knumerror(const TQString & num);
00083 
00084   //virtual ~_knumerror() { }
00085 
00086   _knumerror const & operator = (_knumerror const & num);
00087 
00088   virtual void copy(_knumber const & num)
00089   {
00090     _error = dynamic_cast<_knumerror const &>(num)._error;
00091   }
00092 
00093   virtual NumType type(void) const {return SpecialType;}
00094 
00095   virtual TQString const ascii(int prec = -1) const;
00096 
00097   virtual _knumber * abs(void) const;
00098   virtual _knumber * intPart(void) const;
00099   virtual int sign(void) const;
00100   virtual _knumber * cbrt(void) const;
00101   virtual _knumber * sqrt(void) const;
00102   virtual _knumber * change_sign(void) const;
00103   virtual _knumber * reciprocal(void) const;
00104   virtual _knumber * add(_knumber const & arg2) const;
00105   virtual _knumber * multiply(_knumber const & arg2) const;
00106 
00107   virtual _knumber * power(_knumber const & exponent) const;
00108 
00109   virtual int compare(_knumber const &arg2) const;
00110 
00111   virtual operator signed long int (void) const;
00112   virtual operator unsigned long int (void) const;
00113   virtual operator double (void) const;
00114 
00115  private:
00116 
00117   ErrorType _error;
00118 
00119   friend class _knuminteger;
00120   friend class _knumfraction;
00121   friend class _knumfloat;
00122 };
00123 
00124 
00125 
00126 class _knuminteger : public _knumber
00127 {
00128  public:
00129   _knuminteger(signed int num = 0)
00130   {
00131     mpz_init_set_si(_mpz, num);
00132   }
00133 
00134   _knuminteger(unsigned int num)
00135   {
00136     mpz_init_set_ui(_mpz, num);
00137   }
00138 
00139   _knuminteger(signed long int num)
00140   {
00141     mpz_init_set_si(_mpz, num);
00142   }
00143 
00144   _knuminteger(unsigned long int num)
00145   {
00146     mpz_init_set_ui(_mpz, num);
00147   }
00148   
00149   _knuminteger(unsigned long long int num);
00150 
00151   _knuminteger(_knumber const & num);
00152 
00153   _knuminteger(const TQString & num);
00154 
00155   virtual ~_knuminteger()
00156   {
00157     mpz_clear(_mpz);
00158   }
00159 
00160   _knuminteger const & operator = (_knuminteger const & num);
00161 
00162   virtual void copy(_knumber const & num)
00163   {
00164     mpz_set(_mpz, dynamic_cast<_knuminteger const &>(num)._mpz);
00165   }
00166 
00167   virtual NumType type(void) const {return IntegerType;}
00168 
00169   virtual TQString const ascii(int prec = -1) const;
00170 
00171   virtual _knumber * abs(void) const;
00172   virtual _knumber * intPart(void) const;
00173   virtual int sign(void) const;
00174   virtual _knumber * cbrt(void) const;
00175   virtual _knumber * sqrt(void) const;
00176   virtual _knumber * change_sign(void) const;
00177   virtual _knumber * reciprocal(void) const;
00178   virtual _knumber * add(_knumber const & arg2) const;
00179   virtual _knumber * multiply(_knumber const & arg2) const;
00180 
00181   virtual int compare(_knumber const &arg2) const;
00182 
00183   virtual _knumber * power(_knumber const & exponent) const;
00184 
00185   virtual operator signed long int (void) const;
00186   virtual operator unsigned long int (void) const;
00187   virtual operator double (void) const;
00188 
00189   _knuminteger * intAnd(_knuminteger const &arg2) const;
00190   _knuminteger * intOr(_knuminteger const &arg2) const;
00191   _knumber * mod(_knuminteger const &arg2) const;
00192   _knumber * shift(_knuminteger const &arg2) const;
00193   
00194  private:
00195   mpz_t _mpz;
00196 
00197   friend class _knumfraction;
00198   friend class _knumfloat;
00199 };
00200 
00201 
00202 
00203 class _knumfraction : public _knumber
00204 {
00205  public:
00206   
00207   _knumfraction(signed long int nom = 0, signed long int denom = 1)
00208   {
00209     mpq_init(_mpq);
00210     mpq_set_si(_mpq, nom, denom);
00211     mpq_canonicalize(_mpq);
00212   }
00213 
00214   _knumfraction(_knumber const & num);
00215   
00216   _knumfraction(TQString const & num);
00217 
00218   virtual ~_knumfraction()
00219   {
00220     mpq_clear(_mpq);
00221   }
00222   
00223   virtual void copy(_knumber const & num)
00224   {
00225     mpq_set(_mpq, dynamic_cast<_knumfraction const &>(num)._mpq);
00226   }
00227 
00228   virtual NumType type(void) const {return FractionType;}
00229 
00230   virtual TQString const ascii(int prec = -1) const;
00231   
00232   bool isInteger(void) const;
00233 
00234   virtual _knumber * abs(void) const;
00235   virtual _knumber * intPart(void) const;
00236   virtual int sign(void) const;
00237   virtual _knumber * cbrt(void) const;
00238   virtual _knumber * sqrt(void) const;
00239   virtual _knumber * change_sign(void) const;
00240   virtual _knumber * reciprocal(void) const;
00241   virtual _knumber * add(_knumber const & arg2) const;
00242   virtual _knumber * multiply(_knumber const & arg2) const;
00243 
00244   virtual _knumber * power(_knumber const & exponent) const;
00245   
00246   virtual int compare(_knumber const &arg2) const;
00247 
00248   virtual operator signed long int (void) const;
00249   virtual operator unsigned long int (void) const;
00250   virtual operator double (void) const;
00251 
00252  private:
00253   mpq_t _mpq;
00254 
00255   friend class _knuminteger;
00256   friend class _knumfloat;
00257 };
00258 
00259 class _knumfloat : public _knumber
00260 {
00261  public:
00262   _knumfloat(double num = 1.0)
00263   {
00264     mpf_init(_mpf);
00265     mpf_set_d(_mpf, num);
00266   }
00267   
00268   _knumfloat(_knumber const & num);
00269 
00270   _knumfloat(TQString const & num);
00271   
00272   virtual ~_knumfloat()
00273   {
00274     mpf_clear(_mpf);
00275   }
00276 
00277   virtual void copy(_knumber const & num)
00278   {
00279     mpf_set(_mpf, dynamic_cast<_knumfloat const &>(num)._mpf);
00280   }
00281 
00282   virtual NumType type(void) const {return FloatType;}
00283 
00284   virtual TQString const ascii(int prec = -1) const;
00285 
00286   virtual _knumber * abs(void) const;
00287   virtual _knumber * intPart(void) const;
00288   virtual int sign(void) const;
00289   virtual _knumber * cbrt(void) const;
00290   virtual _knumber * sqrt(void) const;
00291   virtual _knumber * change_sign(void) const;
00292   virtual _knumber * reciprocal(void) const;
00293   virtual _knumber * add(_knumber const & arg2) const;
00294   virtual _knumber * multiply(_knumber const & arg2) const;
00295   virtual _knumber * divide(_knumber const & arg2) const;
00296 
00297   virtual _knumber * power(_knumber const & exponent) const;
00298 
00299   virtual int compare(_knumber const &arg2) const;
00300 
00301   virtual operator signed long int (void) const;
00302   virtual operator unsigned long int (void) const;
00303   virtual operator double (void) const;
00304 
00305  private:
00306     mpf_t _mpf;
00307 
00308   friend class _knuminteger;
00309   friend class _knumfraction;
00310 };
00311 
00312 
00313 #endif //  _KNUMBER_PRIV_H

kcalc/knumber

Skip menu "kcalc/knumber"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

kcalc/knumber

Skip menu "kcalc/knumber"
  • kcalc
  •   knumber
  • superkaramba
Generated for kcalc/knumber by doxygen 1.6.3
This website is maintained by Timothy Pearson.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. |