kcalc/knumber
knumber_priv.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
00028 #ifndef INFINITY
00029 #define INFINITY HUGE_VAL
00030 #endif
00031
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
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