knumber_priv.h00001
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 QString;
00023
00024 #include <gmp.h>
00025
00026
00027 #ifndef INFINITY
00028 #define INFINITY HUGE_VAL
00029 #endif
00030
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
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
|