kcalc
knumber_priv.h
Go to the documentation of this file.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
00023 #include <cstdio>
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 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 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(qint32 num = 0)
00129 {
00130 mpz_init_set_si(_mpz, static_cast<signed long int>(num));
00131 }
00132
00133 _knuminteger(quint32 num)
00134 {
00135 mpz_init_set_ui(_mpz, static_cast<unsigned long int>(num));
00136 }
00137
00138 _knuminteger(quint64 num);
00139
00140 _knuminteger(_knumber const & num);
00141
00142 _knuminteger(const QString & num);
00143
00144 virtual ~_knuminteger()
00145 {
00146 mpz_clear(_mpz);
00147 }
00148
00149 _knuminteger const & operator = (_knuminteger const & num);
00150
00151 virtual void copy(_knumber const & num)
00152 {
00153 mpz_set(_mpz, dynamic_cast<_knuminteger const &>(num)._mpz);
00154 }
00155
00156 virtual NumType type(void) const {return IntegerType;}
00157
00158 virtual QString const ascii(int prec = -1) const;
00159
00160 virtual _knumber * abs(void) const;
00161 virtual _knumber * intPart(void) const;
00162 virtual int sign(void) const;
00163 virtual _knumber * cbrt(void) const;
00164 virtual _knumber * sqrt(void) const;
00165 virtual _knumber * change_sign(void) const;
00166 virtual _knumber * reciprocal(void) const;
00167 virtual _knumber * add(_knumber const & arg2) const;
00168 virtual _knumber * multiply(_knumber const & arg2) const;
00169
00170 virtual int compare(_knumber const &arg2) const;
00171
00172 virtual _knumber * power(_knumber const & exponent) const;
00173
00174 virtual operator long int (void) const;
00175 virtual operator unsigned long int (void) const;
00176 virtual operator double (void) const;
00177
00178 _knuminteger * intAnd(_knuminteger const &arg2) const;
00179 _knuminteger * intOr(_knuminteger const &arg2) const;
00180 _knumber * mod(_knuminteger const &arg2) const;
00181 _knumber * shift(_knuminteger const &arg2) const;
00182
00183 private:
00184 mpz_t _mpz;
00185
00186 friend class _knumfraction;
00187 friend class _knumfloat;
00188 };
00189
00190
00191
00192 class _knumfraction : public _knumber
00193 {
00194 public:
00195
00196 explicit _knumfraction(signed long int nom = 0, signed long int denom = 1)
00197 {
00198 mpq_init(_mpq);
00199 mpq_set_si(_mpq, nom, denom);
00200 mpq_canonicalize(_mpq);
00201 }
00202
00203 _knumfraction(_knumber const & num);
00204
00205 _knumfraction(QString const & num);
00206
00207 virtual ~_knumfraction()
00208 {
00209 mpq_clear(_mpq);
00210 }
00211
00212 virtual void copy(_knumber const & num)
00213 {
00214 mpq_set(_mpq, dynamic_cast<_knumfraction const &>(num)._mpq);
00215 }
00216
00217 virtual NumType type(void) const {return FractionType;}
00218
00219 virtual QString const ascii(int prec = -1) const;
00220
00221 bool isInteger(void) const;
00222
00223 virtual _knumber * abs(void) const;
00224 virtual _knumber * intPart(void) const;
00225 virtual int sign(void) const;
00226 virtual _knumber * cbrt(void) const;
00227 virtual _knumber * sqrt(void) const;
00228 virtual _knumber * change_sign(void) const;
00229 virtual _knumber * reciprocal(void) const;
00230 virtual _knumber * add(_knumber const & arg2) const;
00231 virtual _knumber * multiply(_knumber const & arg2) const;
00232
00233 virtual _knumber * power(_knumber const & exponent) const;
00234
00235 virtual int compare(_knumber const &arg2) const;
00236
00237 virtual operator long int (void) const;
00238 virtual operator unsigned long int (void) const;
00239 virtual operator double (void) const;
00240
00241 private:
00242 mpq_t _mpq;
00243
00244 friend class _knuminteger;
00245 friend class _knumfloat;
00246 };
00247
00248 class _knumfloat : public _knumber
00249 {
00250 public:
00251 _knumfloat(double num = 1.0)
00252 {
00253 mpf_init(_mpf);
00254 mpf_set_d(_mpf, num);
00255 }
00256
00257 _knumfloat(_knumber const & num);
00258
00259 _knumfloat(QString const & num);
00260
00261 virtual ~_knumfloat()
00262 {
00263 mpf_clear(_mpf);
00264 }
00265
00266 virtual void copy(_knumber const & num)
00267 {
00268 mpf_set(_mpf, dynamic_cast<_knumfloat const &>(num)._mpf);
00269 }
00270
00271 virtual NumType type(void) const {return FloatType;}
00272
00273 virtual QString const ascii(int prec = -1) const;
00274
00275 virtual _knumber * abs(void) const;
00276 virtual _knumber * intPart(void) const;
00277 virtual int sign(void) const;
00278 virtual _knumber * cbrt(void) const;
00279 virtual _knumber * sqrt(void) const;
00280 virtual _knumber * change_sign(void) const;
00281 virtual _knumber * reciprocal(void) const;
00282 virtual _knumber * add(_knumber const & arg2) const;
00283 virtual _knumber * multiply(_knumber const & arg2) const;
00284 virtual _knumber * divide(_knumber const & arg2) const;
00285
00286 virtual _knumber * power(_knumber const & exponent) const;
00287
00288 virtual int compare(_knumber const &arg2) const;
00289
00290 virtual operator long int (void) const;
00291 virtual operator unsigned long int (void) const;
00292 virtual operator double (void) const;
00293
00294 private:
00295 mpf_t _mpf;
00296
00297 friend class _knuminteger;
00298 friend class _knumfraction;
00299 };
00300
00301
00302 #endif // _KNUMBER_PRIV_H