• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • kcalc/knumber
 

kcalc/knumber

  • kcalc
  • knumber
knumber_priv.h
1 /* This file is part of the KDE libraries
2  Copyright (C) 2005 Klaus Niederkrueger <kniederk@math.uni-koeln.de>
3 
4  This library is free software; you can redistribute it and/or
5  modify it under the terms of the GNU Library General Public
6  License as published by the Free Software Foundation; either
7  version 2 of the License, or (at your option) any later version.
8 
9  This library is distributed in the hope that it will be useful,
10  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  Library General Public License for more details.
13 
14  You should have received a copy of the GNU Library General Public License
15  along with this library; see the file COPYING.LIB. If not, write to
16  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  Boston, MA 02110-1301, USA.
18 */
19 #ifndef _KNUMBER_PRIV_H
20 #define _KNUMBER_PRIV_H
21 
22 class TQString;
23 
24 #include <cstdio>
25 #include <gmp.h>
26 
27 // work-around for pre-C99-libs
28 #ifndef INFINITY
29 #define INFINITY HUGE_VAL
30 #endif
31 // this is really ugly
32 #ifndef NAN
33 #define NAN (atof("nan"))
34 #endif
35 
36 class _knumber
37 {
38  public:
39  enum NumType {SpecialType, IntegerType, FractionType, FloatType};
40  enum ErrorType {UndefinedNumber, Infinity, MinusInfinity};
41 
42  _knumber() {}
43 
44  virtual ~_knumber() {}
45 
46  virtual void copy(_knumber const & num) = 0;
47 
48  virtual NumType type(void) const = 0;
49 
50  virtual TQString const ascii(int prec = -1) const = 0;
51 
52  virtual _knumber * abs(void) const = 0;
53  virtual _knumber * intPart(void) const = 0;
54  virtual int sign(void) const = 0;
55  virtual _knumber * sqrt(void) const = 0;
56  virtual _knumber * cbrt(void) const = 0;
57  virtual _knumber * change_sign(void) const = 0;
58  virtual _knumber * reciprocal(void) const = 0;
59  virtual _knumber * add(_knumber const & arg2) const = 0;
60  virtual _knumber * multiply(_knumber const & arg2) const = 0;
61  _knumber * divide(_knumber const & arg2) const;
62 
63  virtual _knumber * power(_knumber const & exponent) const = 0;
64 
65  virtual int compare(_knumber const &arg2) const = 0;
66 
67  virtual operator signed long int (void) const = 0;
68  virtual operator unsigned long int (void) const = 0;
69  virtual operator double (void) const = 0;
70 };
71 
72 
73 
74 class _knumerror : public _knumber
75 {
76  public:
77  _knumerror(ErrorType error = UndefinedNumber)
78  : _error(error) { }
79 
80  _knumerror(_knumber const & num);
81 
82  _knumerror(const TQString & num);
83 
84  //virtual ~_knumerror() { }
85 
86  _knumerror const & operator = (_knumerror const & num);
87 
88  virtual void copy(_knumber const & num)
89  {
90  _error = dynamic_cast<_knumerror const &>(num)._error;
91  }
92 
93  virtual NumType type(void) const {return SpecialType;}
94 
95  virtual TQString const ascii(int prec = -1) const;
96 
97  virtual _knumber * abs(void) const;
98  virtual _knumber * intPart(void) const;
99  virtual int sign(void) const;
100  virtual _knumber * cbrt(void) const;
101  virtual _knumber * sqrt(void) const;
102  virtual _knumber * change_sign(void) const;
103  virtual _knumber * reciprocal(void) const;
104  virtual _knumber * add(_knumber const & arg2) const;
105  virtual _knumber * multiply(_knumber const & arg2) const;
106 
107  virtual _knumber * power(_knumber const & exponent) const;
108 
109  virtual int compare(_knumber const &arg2) const;
110 
111  virtual operator signed long int (void) const;
112  virtual operator unsigned long int (void) const;
113  virtual operator double (void) const;
114 
115  private:
116 
117  ErrorType _error;
118 
119  friend class _knuminteger;
120  friend class _knumfraction;
121  friend class _knumfloat;
122 };
123 
124 
125 
126 class _knuminteger : public _knumber
127 {
128  public:
129  _knuminteger(signed int num = 0)
130  {
131  mpz_init_set_si(_mpz, num);
132  }
133 
134  _knuminteger(unsigned int num)
135  {
136  mpz_init_set_ui(_mpz, num);
137  }
138 
139  _knuminteger(signed long int num)
140  {
141  mpz_init_set_si(_mpz, num);
142  }
143 
144  _knuminteger(unsigned long int num)
145  {
146  mpz_init_set_ui(_mpz, num);
147  }
148 
149  _knuminteger(unsigned long long int num);
150 
151  _knuminteger(_knumber const & num);
152 
153  _knuminteger(const TQString & num);
154 
155  virtual ~_knuminteger()
156  {
157  mpz_clear(_mpz);
158  }
159 
160  _knuminteger const & operator = (_knuminteger const & num);
161 
162  virtual void copy(_knumber const & num)
163  {
164  mpz_set(_mpz, dynamic_cast<_knuminteger const &>(num)._mpz);
165  }
166 
167  virtual NumType type(void) const {return IntegerType;}
168 
169  virtual TQString const ascii(int prec = -1) const;
170 
171  virtual _knumber * abs(void) const;
172  virtual _knumber * intPart(void) const;
173  virtual int sign(void) const;
174  virtual _knumber * cbrt(void) const;
175  virtual _knumber * sqrt(void) const;
176  virtual _knumber * change_sign(void) const;
177  virtual _knumber * reciprocal(void) const;
178  virtual _knumber * add(_knumber const & arg2) const;
179  virtual _knumber * multiply(_knumber const & arg2) const;
180 
181  virtual int compare(_knumber const &arg2) const;
182 
183  virtual _knumber * power(_knumber const & exponent) const;
184 
185  virtual operator signed long int (void) const;
186  virtual operator unsigned long int (void) const;
187  virtual operator double (void) const;
188 
189  _knuminteger * intAnd(_knuminteger const &arg2) const;
190  _knuminteger * intOr(_knuminteger const &arg2) const;
191  _knumber * mod(_knuminteger const &arg2) const;
192  _knumber * shift(_knuminteger const &arg2) const;
193 
194  private:
195  mpz_t _mpz;
196 
197  friend class _knumfraction;
198  friend class _knumfloat;
199 };
200 
201 
202 
203 class _knumfraction : public _knumber
204 {
205  public:
206 
207  _knumfraction(signed long int nom = 0, signed long int denom = 1)
208  {
209  mpq_init(_mpq);
210  mpq_set_si(_mpq, nom, denom);
211  mpq_canonicalize(_mpq);
212  }
213 
214  _knumfraction(_knumber const & num);
215 
216  _knumfraction(TQString const & num);
217 
218  virtual ~_knumfraction()
219  {
220  mpq_clear(_mpq);
221  }
222 
223  virtual void copy(_knumber const & num)
224  {
225  mpq_set(_mpq, dynamic_cast<_knumfraction const &>(num)._mpq);
226  }
227 
228  virtual NumType type(void) const {return FractionType;}
229 
230  virtual TQString const ascii(int prec = -1) const;
231 
232  bool isInteger(void) const;
233 
234  virtual _knumber * abs(void) const;
235  virtual _knumber * intPart(void) const;
236  virtual int sign(void) const;
237  virtual _knumber * cbrt(void) const;
238  virtual _knumber * sqrt(void) const;
239  virtual _knumber * change_sign(void) const;
240  virtual _knumber * reciprocal(void) const;
241  virtual _knumber * add(_knumber const & arg2) const;
242  virtual _knumber * multiply(_knumber const & arg2) const;
243 
244  virtual _knumber * power(_knumber const & exponent) const;
245 
246  virtual int compare(_knumber const &arg2) const;
247 
248  virtual operator signed long int (void) const;
249  virtual operator unsigned long int (void) const;
250  virtual operator double (void) const;
251 
252  private:
253  mpq_t _mpq;
254 
255  friend class _knuminteger;
256  friend class _knumfloat;
257 };
258 
259 class _knumfloat : public _knumber
260 {
261  public:
262  _knumfloat(double num = 1.0)
263  {
264  mpf_init(_mpf);
265  mpf_set_d(_mpf, num);
266  }
267 
268  _knumfloat(_knumber const & num);
269 
270  _knumfloat(TQString const & num);
271 
272  virtual ~_knumfloat()
273  {
274  mpf_clear(_mpf);
275  }
276 
277  virtual void copy(_knumber const & num)
278  {
279  mpf_set(_mpf, dynamic_cast<_knumfloat const &>(num)._mpf);
280  }
281 
282  virtual NumType type(void) const {return FloatType;}
283 
284  virtual TQString const ascii(int prec = -1) const;
285 
286  virtual _knumber * abs(void) const;
287  virtual _knumber * intPart(void) const;
288  virtual int sign(void) const;
289  virtual _knumber * cbrt(void) const;
290  virtual _knumber * sqrt(void) const;
291  virtual _knumber * change_sign(void) const;
292  virtual _knumber * reciprocal(void) const;
293  virtual _knumber * add(_knumber const & arg2) const;
294  virtual _knumber * multiply(_knumber const & arg2) const;
295  virtual _knumber * divide(_knumber const & arg2) const;
296 
297  virtual _knumber * power(_knumber const & exponent) const;
298 
299  virtual int compare(_knumber const &arg2) const;
300 
301  virtual operator signed long int (void) const;
302  virtual operator unsigned long int (void) const;
303  virtual operator double (void) const;
304 
305  private:
306  mpf_t _mpf;
307 
308  friend class _knuminteger;
309  friend class _knumfraction;
310 };
311 
312 
313 #endif // _KNUMBER_PRIV_H

kcalc/knumber

Skip menu "kcalc/knumber"
  • Main Page
  • Alphabetical List
  • Class List
  • File List
  • Class Members

kcalc/knumber

Skip menu "kcalc/knumber"
  • kcalc
  •   knumber
  • superkaramba
Generated for kcalc/knumber by doxygen 1.8.13
This website is maintained by Timothy Pearson.