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 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
|