• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeutils API Reference
  • KDE Home
  • Contact Us
 

kcalc

  • sources
  • kde-4.12
  • kdeutils
  • kcalc
  • knumber
knumber_integer.cpp
Go to the documentation of this file.
1 /*
2 Copyright (C) 2001 - 2013 Evan Teran
3  evan.teran@gmail.com
4 
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 2 of the License, or
8 (at your option) any later version.
9 
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14 
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18 
19 #include <config-kcalc.h>
20 #include "knumber_integer.h"
21 #include "knumber_float.h"
22 #include "knumber_fraction.h"
23 #include "knumber_error.h"
24 #include <QScopedArrayPointer>
25 #include <QDebug>
26 
27 namespace detail {
28 
29 //------------------------------------------------------------------------------
30 // Name: knumber_integer
31 //------------------------------------------------------------------------------
32 knumber_integer::knumber_integer(const QString &s) {
33  mpz_init(mpz_);
34  mpz_set_str(mpz_, s.toAscii(), 10);
35 }
36 
37 //------------------------------------------------------------------------------
38 // Name: knumber_integer
39 //------------------------------------------------------------------------------
40 knumber_integer::knumber_integer(qint32 value) {
41  mpz_init_set_si(mpz_, static_cast<signed long int>(value));
42 }
43 
44 //------------------------------------------------------------------------------
45 // Name: knumber_integer
46 //------------------------------------------------------------------------------
47 knumber_integer::knumber_integer(qint64 value) {
48  mpz_init(mpz_);
49 #if SIZEOF_SIGNED_LONG == 8
50  mpz_set_si(mpz_, static_cast<signed long int>(value));
51 #elif SIZEOF_SIGNED_LONG == 4
52  mpz_set_si(mpz_, static_cast<signed long int>(value >> 32));
53  mpz_mul_2exp(mpz_, mpz_, 32);
54  mpz_add_ui(mpz_, mpz_, static_cast<signed long int>(value));
55 #else
56 #error "SIZEOF_SIGNED_LONG is a unhandled case"
57 #endif
58 }
59 
60 //------------------------------------------------------------------------------
61 // Name: knumber_integer
62 //------------------------------------------------------------------------------
63 knumber_integer::knumber_integer(quint32 value) {
64  mpz_init_set_ui(mpz_, static_cast<unsigned long int>(value));
65 }
66 
67 //------------------------------------------------------------------------------
68 // Name: knumber_integer
69 //------------------------------------------------------------------------------
70 knumber_integer::knumber_integer(quint64 value) {
71  mpz_init(mpz_);
72 #if SIZEOF_UNSIGNED_LONG == 8
73  mpz_set_ui(mpz_, static_cast<unsigned long int>(value));
74 #elif SIZEOF_UNSIGNED_LONG == 4
75  mpz_set_ui(mpz_, static_cast<unsigned long int>(value >> 32));
76  mpz_mul_2exp(mpz_, mpz_, 32);
77  mpz_add_ui(mpz_, mpz_, static_cast<unsigned long int>(value));
78 #else
79 #error "SIZEOF_UNSIGNED_LONG is a unhandled case"
80 #endif
81 }
82 
83 //------------------------------------------------------------------------------
84 // Name: knumber_integer
85 //------------------------------------------------------------------------------
86 knumber_integer::knumber_integer(mpz_t mpz) {
87  mpz_init_set(mpz_, mpz);
88 }
89 
90 //------------------------------------------------------------------------------
91 // Name: knumber_integer
92 //------------------------------------------------------------------------------
93 knumber_integer::knumber_integer(const knumber_integer *value) {
94  mpz_init_set(mpz_, value->mpz_);
95 }
96 
97 //------------------------------------------------------------------------------
98 // Name: knumber_integer
99 //------------------------------------------------------------------------------
100 knumber_integer::knumber_integer(const knumber_float *value) {
101  mpz_init(mpz_);
102  mpz_set_f(mpz_, value->mpf_);
103 }
104 
105 //------------------------------------------------------------------------------
106 // Name: knumber_integer
107 //------------------------------------------------------------------------------
108 knumber_integer::knumber_integer(const knumber_fraction *value) {
109  mpz_init(mpz_);
110  mpz_set_q(mpz_, value->mpq_);
111 }
112 
113 //------------------------------------------------------------------------------
114 // Name: clone
115 //------------------------------------------------------------------------------
116 knumber_base *knumber_integer::clone() {
117  return new knumber_integer(this);
118 }
119 
120 //------------------------------------------------------------------------------
121 // Name: ~knumber_integer
122 //------------------------------------------------------------------------------
123 knumber_integer::~knumber_integer() {
124  mpz_clear(mpz_);
125 }
126 
127 //------------------------------------------------------------------------------
128 // Name: add
129 //------------------------------------------------------------------------------
130 knumber_base *knumber_integer::add(knumber_base *rhs) {
131 
132  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
133  mpz_add(mpz_, mpz_, p->mpz_);
134  return this;
135  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
136  knumber_float *const f = new knumber_float(this);
137  delete this;
138  return f->add(p);
139  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
140  knumber_fraction *const q = new knumber_fraction(this);
141  delete this;
142  return q->add(p);
143  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
144  delete this;
145  return p->clone();
146  }
147 
148  Q_ASSERT(0);
149  return 0;
150 }
151 
152 //------------------------------------------------------------------------------
153 // Name: sub
154 //------------------------------------------------------------------------------
155 knumber_base *knumber_integer::sub(knumber_base *rhs) {
156 
157  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
158  mpz_sub(mpz_, mpz_, p->mpz_);
159  return this;
160  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
161  knumber_float *f = new knumber_float(this);
162  delete this;
163  return f->sub(p);
164  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
165  knumber_fraction *q = new knumber_fraction(this);
166  delete this;
167  return q->sub(p);
168  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
169  knumber_base *e = p->clone();
170  delete this;
171  return e->neg();
172  }
173 
174  Q_ASSERT(0);
175  return 0;
176 }
177 
178 //------------------------------------------------------------------------------
179 // Name: mul
180 //------------------------------------------------------------------------------
181 knumber_base *knumber_integer::mul(knumber_base *rhs) {
182 
183  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
184  mpz_mul(mpz_, mpz_, p->mpz_);
185  return this;
186  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
187  knumber_float *f = new knumber_float(this);
188  delete this;
189  return f->mul(p);
190  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
191  knumber_fraction *q = new knumber_fraction(this);
192  delete this;
193  return q->mul(p);
194  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
195 
196  if(is_zero()) {
197  delete this;
198  knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
199  return e->neg();
200  }
201 
202  if(sign() < 0) {
203  delete this;
204  knumber_base *e = p->clone();
205  return e->neg();
206  } else {
207  delete this;
208  return p->clone();
209  }
210  }
211 
212  Q_ASSERT(0);
213  return 0;
214 }
215 
216 //------------------------------------------------------------------------------
217 // Name: div
218 //------------------------------------------------------------------------------
219 knumber_base *knumber_integer::div(knumber_base *rhs) {
220 
221  if(rhs->is_zero()) {
222  if(sign() < 0) {
223  delete this;
224  return new knumber_error(knumber_error::ERROR_NEG_INFINITY);
225  } else {
226  delete this;
227  return new knumber_error(knumber_error::ERROR_POS_INFINITY);
228  }
229  }
230 
231  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
232  knumber_fraction *q = new knumber_fraction(this);
233  delete this;
234  return q->div(p);
235  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
236  knumber_float *f = new knumber_float(this);
237  delete this;
238  return f->div(p);
239  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
240  knumber_fraction *q = new knumber_fraction(this);
241  delete this;
242  return q->div(p);
243  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
244 
245  if(p->sign() > 0) {
246  delete this;
247  return new knumber_integer(0);
248  } else if(p->sign() < 0) {
249  delete this;
250  return new knumber_integer(0);
251  }
252 
253  delete this;
254  return p->clone();
255  }
256 
257  Q_ASSERT(0);
258  return 0;
259 }
260 
261 //------------------------------------------------------------------------------
262 // Name: mod
263 //------------------------------------------------------------------------------
264 knumber_base *knumber_integer::mod(knumber_base *rhs) {
265 
266  if(rhs->is_zero()) {
267  delete this;
268  return new knumber_error(knumber_error::ERROR_UNDEFINED);
269  }
270 
271  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
272  mpz_mod(mpz_, mpz_, p->mpz_);
273  return this;
274  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
275  knumber_float *f = new knumber_float(this);
276  delete this;
277  return f->mod(p);
278  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
279  knumber_fraction *q = new knumber_fraction(this);
280  delete this;
281  return q->mod(p);
282  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
283  delete this;
284  return p->clone();
285  }
286 
287  Q_ASSERT(0);
288  return 0;
289 }
290 
291 //------------------------------------------------------------------------------
292 // Name: bitwise_and
293 //------------------------------------------------------------------------------
294 knumber_base *knumber_integer::bitwise_and(knumber_base *rhs) {
295 
296  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
297  mpz_and(mpz_, mpz_, p->mpz_);
298  return this;
299  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
300  knumber_float *f = new knumber_float(this);
301  delete this;
302  return f->bitwise_and(p);
303  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
304  knumber_fraction *f = new knumber_fraction(this);
305  delete this;
306  return f->bitwise_and(p);
307  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
308  delete this;
309  return p->clone();
310  }
311 
312  Q_ASSERT(0);
313  return 0;
314 }
315 
316 //------------------------------------------------------------------------------
317 // Name: bitwise_xor
318 //------------------------------------------------------------------------------
319 knumber_base *knumber_integer::bitwise_xor(knumber_base *rhs) {
320 
321  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
322  mpz_xor(mpz_, mpz_, p->mpz_);
323  return this;
324  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
325  knumber_float *f = new knumber_float(this);
326  delete this;
327  return f->bitwise_xor(p);
328  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
329  knumber_fraction *f = new knumber_fraction(this);
330  delete this;
331  return f->bitwise_xor(p);
332  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
333  delete this;
334  return p->clone();
335  }
336 
337  Q_ASSERT(0);
338  return 0;
339 }
340 
341 //------------------------------------------------------------------------------
342 // Name: bitwise_or
343 //------------------------------------------------------------------------------
344 knumber_base *knumber_integer::bitwise_or(knumber_base *rhs) {
345 
346  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
347  mpz_ior(mpz_, mpz_, p->mpz_);
348  return this;
349  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
350  knumber_float *f = new knumber_float(this);
351  delete this;
352  return f->bitwise_or(p);
353  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
354  knumber_fraction *f = new knumber_fraction(this);
355  delete this;
356  return f->bitwise_or(p);
357  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
358  delete this;
359  return p->clone();
360  }
361 
362  Q_ASSERT(0);
363  return 0;
364 }
365 
366 //------------------------------------------------------------------------------
367 // Name: bitwise_shift
368 //------------------------------------------------------------------------------
369 knumber_base *knumber_integer::bitwise_shift(knumber_base *rhs) {
370 
371  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
372 
373  const signed long int bit_count = mpz_get_si(p->mpz_);
374 
375  // TODO: left shift with high bit set is broken in
376  // non decimal modes :-/, always displays 0
377  // interestingly, the bit is not "lost"
378  // we simply don't have a mechanism to display
379  // values in HEX/DEC/OCT mode which are greater than
380  // 64-bits
381 
382  if(bit_count > 0) {
383  // left shift
384  mpz_mul_2exp(mpz_, mpz_, bit_count);
385  } else if(bit_count < 0) {
386  // right shift
387  if(mpz_sgn(mpz_) < 0) {
388  mpz_fdiv_q_2exp(mpz_, mpz_, -bit_count);
389  } else {
390  mpz_tdiv_q_2exp(mpz_, mpz_, -bit_count);
391  }
392  }
393  return this;
394  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
395  Q_UNUSED(p);
396  knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
397  delete this;
398  return e;
399  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
400  Q_UNUSED(p);
401  knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
402  delete this;
403  return e;
404  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
405  Q_UNUSED(p);
406  knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
407  delete this;
408  return e;
409  }
410 
411  Q_ASSERT(0);
412  return 0;
413 }
414 
415 //------------------------------------------------------------------------------
416 // Name: neg
417 //------------------------------------------------------------------------------
418 knumber_base *knumber_integer::neg() {
419 
420  mpz_neg(mpz_, mpz_);
421  return this;
422 }
423 
424 //------------------------------------------------------------------------------
425 // Name: cmp
426 //------------------------------------------------------------------------------
427 knumber_base *knumber_integer::cmp() {
428 
429 #if 0
430  // unfortunately this breaks things pretty badly
431  // for non-decimal modes :-(
432  mpz_com(mpz_, mpz_);
433 #else
434  mpz_swap(mpz_, knumber_integer(~toUint64()).mpz_);
435 #endif
436  return this;
437 }
438 
439 //------------------------------------------------------------------------------
440 // Name: abs
441 //------------------------------------------------------------------------------
442 knumber_base *knumber_integer::abs() {
443 
444  mpz_abs(mpz_, mpz_);
445  return this;
446 }
447 
448 //------------------------------------------------------------------------------
449 // Name: sqrt
450 //------------------------------------------------------------------------------
451 knumber_base *knumber_integer::sqrt() {
452 
453  if(sign() < 0) {
454  delete this;
455  return new knumber_error(knumber_error::ERROR_UNDEFINED);
456  }
457 
458  if(mpz_perfect_square_p(mpz_)) {
459  mpz_sqrt(mpz_, mpz_);
460  return this;
461  } else {
462  knumber_float *f = new knumber_float(this);
463  delete this;
464  return f->sqrt();
465  }
466 }
467 
468 //------------------------------------------------------------------------------
469 // Name: cbrt
470 //------------------------------------------------------------------------------
471 knumber_base *knumber_integer::cbrt() {
472 
473  mpz_t x;
474  mpz_init_set(x, mpz_);
475  if(mpz_root(x, x, 3)) {
476  mpz_swap(mpz_, x);
477  mpz_clear(x);
478  return this;
479  }
480 
481  mpz_clear(x);
482  knumber_float *f = new knumber_float(this);
483  delete this;
484  return f->cbrt();
485 }
486 
487 //------------------------------------------------------------------------------
488 // Name: pow
489 //------------------------------------------------------------------------------
490 knumber_base *knumber_integer::pow(knumber_base *rhs) {
491 
492  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
493 
494  if(is_zero() && p->is_even() && p->sign() < 0) {
495  delete this;
496  return new knumber_error(knumber_error::ERROR_POS_INFINITY);
497  }
498 
499  mpz_pow_ui(mpz_, mpz_, mpz_get_ui(p->mpz_));
500 
501  if(p->sign() < 0) {
502  return reciprocal();
503  } else {
504  return this;
505  }
506  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
507  knumber_float *f = new knumber_float(this);
508  delete this;
509  return f->pow(p);
510  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
511  knumber_fraction *f = new knumber_fraction(this);
512  delete this;
513  return f->pow(p);
514  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
515  if(p->sign() > 0) {
516  knumber_error *e = new knumber_error(knumber_error::ERROR_POS_INFINITY);
517  delete this;
518  return e;
519  } else if(p->sign() < 0) {
520  mpz_init_set_si(mpz_, 0);
521  return this;
522  } else {
523  knumber_error *e = new knumber_error(knumber_error::ERROR_UNDEFINED);
524  delete this;
525  return e;
526  }
527  }
528 
529  Q_ASSERT(0);
530  return 0;
531 }
532 
533 //------------------------------------------------------------------------------
534 // Name: sin
535 //------------------------------------------------------------------------------
536 knumber_base *knumber_integer::sin() {
537 
538  knumber_float *f = new knumber_float(this);
539  delete this;
540  return f->sin();
541 }
542 
543 //------------------------------------------------------------------------------
544 // Name: cos
545 //------------------------------------------------------------------------------
546 knumber_base *knumber_integer::cos() {
547 
548  knumber_float *f = new knumber_float(this);
549  delete this;
550  return f->cos();
551 }
552 
553 //------------------------------------------------------------------------------
554 // Name: tan
555 //------------------------------------------------------------------------------
556 knumber_base *knumber_integer::tan() {
557 
558  knumber_float *f = new knumber_float(this);
559  delete this;
560  return f->tan();
561 }
562 
563 //------------------------------------------------------------------------------
564 // Name: asin
565 //------------------------------------------------------------------------------
566 knumber_base *knumber_integer::asin() {
567 
568  knumber_float *f = new knumber_float(this);
569  delete this;
570  return f->asin();
571 }
572 
573 //------------------------------------------------------------------------------
574 // Name: acos
575 //------------------------------------------------------------------------------
576 knumber_base *knumber_integer::acos() {
577 
578  knumber_float *f = new knumber_float(this);
579  delete this;
580  return f->acos();
581 }
582 
583 //------------------------------------------------------------------------------
584 // Name: atan
585 //------------------------------------------------------------------------------
586 knumber_base *knumber_integer::atan() {
587 
588  knumber_float *f = new knumber_float(this);
589  delete this;
590  return f->atan();
591 }
592 
593 //------------------------------------------------------------------------------
594 // Name:
595 //------------------------------------------------------------------------------
596 knumber_base *knumber_integer::sinh() {
597  knumber_float *f = new knumber_float(this);
598  delete this;
599  return f->sinh();
600 }
601 
602 //------------------------------------------------------------------------------
603 // Name:
604 //------------------------------------------------------------------------------
605 knumber_base *knumber_integer::cosh() {
606  knumber_float *f = new knumber_float(this);
607  delete this;
608  return f->cosh();
609 }
610 
611 //------------------------------------------------------------------------------
612 // Name:
613 //------------------------------------------------------------------------------
614 knumber_base *knumber_integer::tanh() {
615  knumber_float *f = new knumber_float(this);
616  delete this;
617  return f->tanh();
618 }
619 
620 //------------------------------------------------------------------------------
621 // Name:
622 //------------------------------------------------------------------------------
623 knumber_base *knumber_integer::asinh() {
624  knumber_float *f = new knumber_float(this);
625  delete this;
626  return f->asinh();
627 }
628 
629 //------------------------------------------------------------------------------
630 // Name:
631 //------------------------------------------------------------------------------
632 knumber_base *knumber_integer::acosh() {
633  knumber_float *f = new knumber_float(this);
634  delete this;
635  return f->acosh();
636 }
637 
638 //------------------------------------------------------------------------------
639 // Name:
640 //------------------------------------------------------------------------------
641 knumber_base *knumber_integer::atanh() {
642  knumber_float *f = new knumber_float(this);
643  delete this;
644  return f->atanh();
645 }
646 
647 //------------------------------------------------------------------------------
648 // Name: factorial
649 //------------------------------------------------------------------------------
650 knumber_base *knumber_integer::factorial() {
651 
652  if(sign() < 0) {
653  delete this;
654  return new knumber_error(knumber_error::ERROR_UNDEFINED);
655  }
656 
657  mpz_fac_ui(mpz_, mpz_get_ui(mpz_));
658  return this;
659 }
660 
661 //------------------------------------------------------------------------------
662 // Name: compare
663 //------------------------------------------------------------------------------
664 int knumber_integer::compare(knumber_base *rhs) {
665 
666  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
667  return mpz_cmp(mpz_, p->mpz_);
668  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
669  return knumber_float(this).compare(p);
670  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
671  return knumber_fraction(this).compare(p);
672  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
673  // NOTE: any number compared to NaN/Inf/-Inf always compares less
674  // at the moment
675  return -1;
676  }
677 
678  Q_ASSERT(0);
679  return 0;
680 }
681 
682 //------------------------------------------------------------------------------
683 // Name: toString
684 //------------------------------------------------------------------------------
685 QString knumber_integer::toString(int precision) const {
686 
687  Q_UNUSED(precision);
688 
689  const size_t size = gmp_snprintf(NULL, 0, "%Zd", mpz_) + 1;
690  QScopedArrayPointer<char> buf(new char[size]);
691  gmp_snprintf(&buf[0], size, "%Zd", mpz_);
692  return QLatin1String(&buf[0]);
693 }
694 
695 //------------------------------------------------------------------------------
696 // Name:
697 //------------------------------------------------------------------------------
698 quint64 knumber_integer::toUint64() const {
699  // libgmp doesn't have unsigned long long conversion
700  // so convert to string and then to unsigned long long
701  const QString tmpstring = toString(-1);
702 
703  bool ok;
704  quint64 value;
705 
706  if (sign() < 0) {
707  const qint64 signedvalue = tmpstring.toLongLong(&ok, 10);
708  value = static_cast<quint64>(signedvalue);
709  } else {
710  value = tmpstring.toULongLong(&ok, 10);
711  }
712 
713  if (!ok) {
714  // TODO: what to do if error?
715  value = 0;
716  }
717  return value;
718 }
719 
720 //------------------------------------------------------------------------------
721 // Name:
722 //------------------------------------------------------------------------------
723 qint64 knumber_integer::toInt64() const {
724  // libgmp doesn't have long long conversion
725  // so convert to string and then to long long
726  const QString tmpstring = toString(-1);
727 
728  bool ok;
729  qint64 value = tmpstring.toLongLong(&ok, 10);
730 
731  if (!ok) {
732  // TODO: what to do if error?
733  value = 0;
734  }
735 
736  return value;
737 }
738 
739 //------------------------------------------------------------------------------
740 // Name: is_integer
741 //------------------------------------------------------------------------------
742 bool knumber_integer::is_integer() const {
743  return true;
744 }
745 
746 //------------------------------------------------------------------------------
747 // Name: is_zero
748 //------------------------------------------------------------------------------
749 bool knumber_integer::is_zero() const {
750  return mpz_sgn(mpz_) == 0;
751 }
752 
753 //------------------------------------------------------------------------------
754 // Name: sign
755 //------------------------------------------------------------------------------
756 int knumber_integer::sign() const {
757  return mpz_sgn(mpz_);
758 }
759 
760 //------------------------------------------------------------------------------
761 // Name: is_even
762 //------------------------------------------------------------------------------
763 bool knumber_integer::is_even() const {
764  return mpz_even_p(mpz_);
765 }
766 
767 //------------------------------------------------------------------------------
768 // Name: is_odd
769 //------------------------------------------------------------------------------
770 bool knumber_integer::is_odd() const {
771  return mpz_odd_p(mpz_);
772 }
773 
774 //------------------------------------------------------------------------------
775 // Name: reciprocal
776 //------------------------------------------------------------------------------
777 knumber_base *knumber_integer::reciprocal() {
778  knumber_fraction *q = new knumber_fraction(this);
779  delete this;
780  return q->reciprocal();
781 }
782 
783 //------------------------------------------------------------------------------
784 // Name:
785 //------------------------------------------------------------------------------
786 knumber_base *knumber_integer::log2() {
787  knumber_float *f = new knumber_float(this);
788  delete this;
789  return f->log2();
790 }
791 
792 //------------------------------------------------------------------------------
793 // Name:
794 //------------------------------------------------------------------------------
795 knumber_base *knumber_integer::log10() {
796  knumber_float *f = new knumber_float(this);
797  delete this;
798  return f->log10();
799 }
800 
801 //------------------------------------------------------------------------------
802 // Name:
803 //------------------------------------------------------------------------------
804 knumber_base *knumber_integer::ln() {
805  knumber_float *f = new knumber_float(this);
806  delete this;
807  return f->ln();
808 }
809 
810 //------------------------------------------------------------------------------
811 // Name:
812 //------------------------------------------------------------------------------
813 knumber_base *knumber_integer::exp2() {
814  knumber_float *f = new knumber_float(this);
815  delete this;
816  return f->exp2();
817 }
818 
819 //------------------------------------------------------------------------------
820 // Name:
821 //------------------------------------------------------------------------------
822 knumber_base *knumber_integer::exp10() {
823  knumber_float *f = new knumber_float(this);
824  delete this;
825  return f->exp10();
826 }
827 
828 //------------------------------------------------------------------------------
829 // Name:
830 //------------------------------------------------------------------------------
831 knumber_base *knumber_integer::exp() {
832  knumber_float *f = new knumber_float(this);
833  delete this;
834  return f->exp();
835 }
836 
837 //------------------------------------------------------------------------------
838 // Name:
839 //------------------------------------------------------------------------------
840 knumber_base *knumber_integer::bin(knumber_base *rhs) {
841 
842 
843  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
844  mpz_bin_ui(mpz_, mpz_, mpz_get_ui(p->mpz_));
845  return this;
846 
847  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
848  delete this;
849  return new knumber_error(knumber_error::ERROR_UNDEFINED);
850  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
851  delete this;
852  return new knumber_error(knumber_error::ERROR_UNDEFINED);
853  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
854  delete this;
855  return new knumber_error(knumber_error::ERROR_UNDEFINED);
856  }
857 
858  Q_ASSERT(0);
859  return 0;
860 }
861 
862 }
detail::knumber_integer::~knumber_integer
virtual ~knumber_integer()
Definition: knumber_integer.cpp:123
detail::knumber_integer::ln
virtual knumber_base * ln()
Definition: knumber_integer.cpp:804
detail::knumber_float::cosh
virtual knumber_base * cosh()
Definition: knumber_float.cpp:603
detail::knumber_integer::bitwise_shift
virtual knumber_base * bitwise_shift(knumber_base *rhs)
Definition: knumber_integer.cpp:369
detail::knumber_integer::log10
virtual knumber_base * log10()
Definition: knumber_integer.cpp:795
detail::knumber_integer::toInt64
virtual qint64 toInt64() const
Definition: knumber_integer.cpp:723
detail::knumber_integer::sinh
virtual knumber_base * sinh()
Definition: knumber_integer.cpp:596
detail::knumber_integer::div
virtual knumber_base * div(knumber_base *rhs)
Definition: knumber_integer.cpp:219
detail::knumber_fraction::bitwise_or
virtual knumber_base * bitwise_or(knumber_base *rhs)
Definition: knumber_fraction.cpp:310
detail::knumber_float::tanh
virtual knumber_base * tanh()
Definition: knumber_float.cpp:620
detail::knumber_integer::clone
virtual knumber_base * clone()
Definition: knumber_integer.cpp:116
detail::knumber_integer::bitwise_and
virtual knumber_base * bitwise_and(knumber_base *rhs)
Definition: knumber_integer.cpp:294
detail::knumber_float::atanh
virtual knumber_base * atanh()
Definition: knumber_float.cpp:671
detail::knumber_float::add
virtual knumber_base * add(knumber_base *rhs)
Definition: knumber_float.cpp:171
detail::knumber_float::sqrt
virtual knumber_base * sqrt()
Definition: knumber_float.cpp:374
detail::knumber_integer::neg
virtual knumber_base * neg()
Definition: knumber_integer.cpp:418
detail::knumber_float::tan
virtual knumber_base * tan()
Definition: knumber_float.cpp:485
detail::knumber_error::ERROR_NEG_INFINITY
Definition: knumber_error.h:38
detail::knumber_base::neg
virtual knumber_base * neg()=0
detail::knumber_float::exp10
virtual knumber_base * exp10()
Definition: knumber_float.cpp:895
detail::knumber_fraction::reciprocal
virtual knumber_base * reciprocal()
Definition: knumber_fraction.cpp:771
detail::knumber_float::mul
virtual knumber_base * mul(knumber_base *rhs)
Definition: knumber_float.cpp:219
detail::knumber_integer::sub
virtual knumber_base * sub(knumber_base *rhs)
Definition: knumber_integer.cpp:155
detail::knumber_integer::bitwise_or
virtual knumber_base * bitwise_or(knumber_base *rhs)
Definition: knumber_integer.cpp:344
detail::knumber_integer::atanh
virtual knumber_base * atanh()
Definition: knumber_integer.cpp:641
detail::knumber_integer::cbrt
virtual knumber_base * cbrt()
Definition: knumber_integer.cpp:471
detail::knumber_integer::atan
virtual knumber_base * atan()
Definition: knumber_integer.cpp:586
detail::knumber_fraction::div
virtual knumber_base * div(knumber_base *rhs)
Definition: knumber_fraction.cpp:229
detail::knumber_integer::acosh
virtual knumber_base * acosh()
Definition: knumber_integer.cpp:632
detail::knumber_integer::is_odd
virtual bool is_odd() const
Definition: knumber_integer.cpp:770
detail::knumber_integer::reciprocal
virtual knumber_base * reciprocal()
Definition: knumber_integer.cpp:777
detail::knumber_float::pow
virtual knumber_base * pow(knumber_base *rhs)
Definition: knumber_float.cpp:688
detail::knumber_float::cbrt
virtual knumber_base * cbrt()
Definition: knumber_float.cpp:396
detail::knumber_integer::sin
virtual knumber_base * sin()
Definition: knumber_integer.cpp:536
detail::knumber_integer::compare
virtual int compare(knumber_base *rhs)
Definition: knumber_integer.cpp:664
detail::knumber_integer::bin
virtual knumber_base * bin(knumber_base *rhs)
Definition: knumber_integer.cpp:840
detail::knumber_integer::knumber_fraction
friend class knumber_fraction
Definition: knumber_integer.h:31
detail::knumber_fraction::bitwise_and
virtual knumber_base * bitwise_and(knumber_base *rhs)
Definition: knumber_fraction.cpp:288
detail::knumber_integer::log2
virtual knumber_base * log2()
Definition: knumber_integer.cpp:786
detail::knumber_integer::pow
virtual knumber_base * pow(knumber_base *rhs)
Definition: knumber_integer.cpp:490
detail::knumber_fraction::mul
virtual knumber_base * mul(knumber_base *rhs)
Definition: knumber_fraction.cpp:191
detail::knumber_base::is_zero
virtual bool is_zero() const =0
detail::knumber_integer::cos
virtual knumber_base * cos()
Definition: knumber_integer.cpp:546
detail::knumber_integer::toUint64
virtual quint64 toUint64() const
Definition: knumber_integer.cpp:698
detail::knumber_float::sin
virtual knumber_base * sin()
Definition: knumber_float.cpp:438
detail::knumber_base
Definition: knumber_base.h:38
detail::knumber_base::clone
virtual knumber_base * clone()=0
detail::knumber_fraction
Definition: knumber_fraction.h:28
detail::knumber_fraction::sub
virtual knumber_base * sub(knumber_base *rhs)
Definition: knumber_fraction.cpp:165
detail::knumber_integer::asin
virtual knumber_base * asin()
Definition: knumber_integer.cpp:566
detail::knumber_integer::mul
virtual knumber_base * mul(knumber_base *rhs)
Definition: knumber_integer.cpp:181
detail::knumber_float::ln
virtual knumber_base * ln()
Definition: knumber_float.cpp:851
detail::knumber_fraction::pow
virtual knumber_base * pow(knumber_base *rhs)
Definition: knumber_fraction.cpp:435
detail::knumber_integer::knumber_float
friend class knumber_float
Definition: knumber_integer.h:32
detail::knumber_integer
Definition: knumber_integer.h:28
detail::knumber_integer::is_even
virtual bool is_even() const
Definition: knumber_integer.cpp:763
detail::knumber_integer::is_zero
virtual bool is_zero() const
Definition: knumber_integer.cpp:749
detail::knumber_integer::exp2
virtual knumber_base * exp2()
Definition: knumber_integer.cpp:813
detail::knumber_integer::acos
virtual knumber_base * acos()
Definition: knumber_integer.cpp:576
detail::knumber_float::div
virtual knumber_base * div(knumber_base *rhs)
Definition: knumber_float.cpp:253
knumber_fraction.h
detail::knumber_fraction::mod
virtual knumber_base * mod(knumber_base *rhs)
Definition: knumber_fraction.cpp:273
detail::knumber_integer::exp
virtual knumber_base * exp()
Definition: knumber_integer.cpp:831
detail::knumber_integer::exp10
virtual knumber_base * exp10()
Definition: knumber_integer.cpp:822
detail::knumber_float::bitwise_or
virtual knumber_base * bitwise_or(knumber_base *rhs)
Definition: knumber_float.cpp:327
detail::knumber_float::sub
virtual knumber_base * sub(knumber_base *rhs)
Definition: knumber_float.cpp:195
detail::knumber_float::bitwise_xor
virtual knumber_base * bitwise_xor(knumber_base *rhs)
Definition: knumber_float.cpp:317
detail::knumber_float::asinh
virtual knumber_base * asinh()
Definition: knumber_float.cpp:637
detail::knumber_float::exp2
virtual knumber_base * exp2()
Definition: knumber_float.cpp:873
detail::knumber_fraction::add
virtual knumber_base * add(knumber_base *rhs)
Definition: knumber_fraction.cpp:139
detail::knumber_float::acos
virtual knumber_base * acos()
Definition: knumber_float.cpp:535
detail::knumber_float::mod
virtual knumber_base * mod(knumber_base *rhs)
Definition: knumber_float.cpp:291
detail::knumber_float::exp
virtual knumber_base * exp()
Definition: knumber_float.cpp:917
detail::knumber_integer::knumber_integer
knumber_integer(const QString &s)
Definition: knumber_integer.cpp:32
detail::knumber_float::log10
virtual knumber_base * log10()
Definition: knumber_float.cpp:829
knumber_integer.h
detail::knumber_integer::bitwise_xor
virtual knumber_base * bitwise_xor(knumber_base *rhs)
Definition: knumber_integer.cpp:319
detail::knumber_float::acosh
virtual knumber_base * acosh()
Definition: knumber_float.cpp:654
detail::knumber_fraction::bitwise_xor
virtual knumber_base * bitwise_xor(knumber_base *rhs)
Definition: knumber_fraction.cpp:299
detail::knumber_integer::abs
virtual knumber_base * abs()
Definition: knumber_integer.cpp:442
detail::knumber_error::ERROR_POS_INFINITY
Definition: knumber_error.h:37
detail::knumber_float::atan
virtual knumber_base * atan()
Definition: knumber_float.cpp:562
detail::knumber_integer::tan
virtual knumber_base * tan()
Definition: knumber_integer.cpp:556
detail::knumber_integer::sqrt
virtual knumber_base * sqrt()
Definition: knumber_integer.cpp:451
detail::knumber_integer::toString
virtual QString toString(int precision) const
Definition: knumber_integer.cpp:685
detail::knumber_float::cos
virtual knumber_base * cos()
Definition: knumber_float.cpp:462
detail::knumber_integer::add
virtual knumber_base * add(knumber_base *rhs)
Definition: knumber_integer.cpp:130
detail::knumber_float::asin
virtual knumber_base * asin()
Definition: knumber_float.cpp:508
detail::knumber_float
Definition: knumber_float.h:28
detail::knumber_integer::tanh
virtual knumber_base * tanh()
Definition: knumber_integer.cpp:614
knumber_error.h
knumber_float.h
detail::knumber_error
Definition: knumber_error.h:28
detail::knumber_integer::sign
virtual int sign() const
Definition: knumber_integer.cpp:756
detail::knumber_float::sinh
virtual knumber_base * sinh()
Definition: knumber_float.cpp:585
detail::knumber_integer::cosh
virtual knumber_base * cosh()
Definition: knumber_integer.cpp:605
detail::knumber_float::log2
virtual knumber_base * log2()
Definition: knumber_float.cpp:807
detail::knumber_error::ERROR_UNDEFINED
Definition: knumber_error.h:36
detail::knumber_integer::mod
virtual knumber_base * mod(knumber_base *rhs)
Definition: knumber_integer.cpp:264
detail::knumber_integer::factorial
virtual knumber_base * factorial()
Definition: knumber_integer.cpp:650
detail::knumber_integer::asinh
virtual knumber_base * asinh()
Definition: knumber_integer.cpp:623
detail::knumber_integer::knumber_error
friend class knumber_error
Definition: knumber_integer.h:30
detail::knumber_integer::is_integer
virtual bool is_integer() const
Definition: knumber_integer.cpp:742
detail::knumber_float::bitwise_and
virtual knumber_base * bitwise_and(knumber_base *rhs)
Definition: knumber_float.cpp:307
detail::knumber_integer::cmp
virtual knumber_base * cmp()
Definition: knumber_integer.cpp:427
detail::knumber_error::neg
virtual knumber_base * neg()
Definition: knumber_error.cpp:300
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 23:08:05 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kcalc

Skip menu "kcalc"
  • Main Page
  • Namespace List
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeutils API Reference

Skip menu "kdeutils API Reference"
  • ark
  • filelight
  • kcalc
  • kcharselect
  • kdf
  • kfloppy
  • kgpg
  • kremotecontrol
  • ktimer
  • kwallet
  • superkaramba
  • sweeper

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal