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