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

kcalc

  • sources
  • kde-4.14
  • 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: tgamma
595 //------------------------------------------------------------------------------
596 knumber_base *knumber_integer::tgamma() {
597 
598  knumber_float *f = new knumber_float(this);
599  delete this;
600  return f->tgamma();
601 }
602 
603 //------------------------------------------------------------------------------
604 // Name:
605 //------------------------------------------------------------------------------
606 knumber_base *knumber_integer::sinh() {
607  knumber_float *f = new knumber_float(this);
608  delete this;
609  return f->sinh();
610 }
611 
612 //------------------------------------------------------------------------------
613 // Name:
614 //------------------------------------------------------------------------------
615 knumber_base *knumber_integer::cosh() {
616  knumber_float *f = new knumber_float(this);
617  delete this;
618  return f->cosh();
619 }
620 
621 //------------------------------------------------------------------------------
622 // Name:
623 //------------------------------------------------------------------------------
624 knumber_base *knumber_integer::tanh() {
625  knumber_float *f = new knumber_float(this);
626  delete this;
627  return f->tanh();
628 }
629 
630 //------------------------------------------------------------------------------
631 // Name:
632 //------------------------------------------------------------------------------
633 knumber_base *knumber_integer::asinh() {
634  knumber_float *f = new knumber_float(this);
635  delete this;
636  return f->asinh();
637 }
638 
639 //------------------------------------------------------------------------------
640 // Name:
641 //------------------------------------------------------------------------------
642 knumber_base *knumber_integer::acosh() {
643  knumber_float *f = new knumber_float(this);
644  delete this;
645  return f->acosh();
646 }
647 
648 //------------------------------------------------------------------------------
649 // Name:
650 //------------------------------------------------------------------------------
651 knumber_base *knumber_integer::atanh() {
652  knumber_float *f = new knumber_float(this);
653  delete this;
654  return f->atanh();
655 }
656 
657 //------------------------------------------------------------------------------
658 // Name: factorial
659 //------------------------------------------------------------------------------
660 knumber_base *knumber_integer::factorial() {
661 
662  if(sign() < 0) {
663  delete this;
664  return new knumber_error(knumber_error::ERROR_UNDEFINED);
665  }
666 
667  mpz_fac_ui(mpz_, mpz_get_ui(mpz_));
668  return this;
669 }
670 
671 //------------------------------------------------------------------------------
672 // Name: compare
673 //------------------------------------------------------------------------------
674 int knumber_integer::compare(knumber_base *rhs) {
675 
676  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
677  return mpz_cmp(mpz_, p->mpz_);
678  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
679  return knumber_float(this).compare(p);
680  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
681  return knumber_fraction(this).compare(p);
682  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
683  // NOTE: any number compared to NaN/Inf/-Inf always compares less
684  // at the moment
685  return -1;
686  }
687 
688  Q_ASSERT(0);
689  return 0;
690 }
691 
692 //------------------------------------------------------------------------------
693 // Name: toString
694 //------------------------------------------------------------------------------
695 QString knumber_integer::toString(int precision) const {
696 
697  Q_UNUSED(precision);
698 
699  const size_t size = gmp_snprintf(NULL, 0, "%Zd", mpz_) + 1;
700  QScopedArrayPointer<char> buf(new char[size]);
701  gmp_snprintf(&buf[0], size, "%Zd", mpz_);
702  return QLatin1String(&buf[0]);
703 }
704 
705 //------------------------------------------------------------------------------
706 // Name:
707 //------------------------------------------------------------------------------
708 quint64 knumber_integer::toUint64() const {
709  // libgmp doesn't have unsigned long long conversion
710  // so convert to string and then to unsigned long long
711  const QString tmpstring = toString(-1);
712 
713  bool ok;
714  quint64 value;
715 
716  if (sign() < 0) {
717  const qint64 signedvalue = tmpstring.toLongLong(&ok, 10);
718  value = static_cast<quint64>(signedvalue);
719  } else {
720  value = tmpstring.toULongLong(&ok, 10);
721  }
722 
723  if (!ok) {
724  // TODO: what to do if error?
725  value = 0;
726  }
727  return value;
728 }
729 
730 //------------------------------------------------------------------------------
731 // Name:
732 //------------------------------------------------------------------------------
733 qint64 knumber_integer::toInt64() const {
734  // libgmp doesn't have long long conversion
735  // so convert to string and then to long long
736  const QString tmpstring = toString(-1);
737 
738  bool ok;
739  qint64 value = tmpstring.toLongLong(&ok, 10);
740 
741  if (!ok) {
742  // TODO: what to do if error?
743  value = 0;
744  }
745 
746  return value;
747 }
748 
749 //------------------------------------------------------------------------------
750 // Name: is_integer
751 //------------------------------------------------------------------------------
752 bool knumber_integer::is_integer() const {
753  return true;
754 }
755 
756 //------------------------------------------------------------------------------
757 // Name: is_zero
758 //------------------------------------------------------------------------------
759 bool knumber_integer::is_zero() const {
760  return mpz_sgn(mpz_) == 0;
761 }
762 
763 //------------------------------------------------------------------------------
764 // Name: sign
765 //------------------------------------------------------------------------------
766 int knumber_integer::sign() const {
767  return mpz_sgn(mpz_);
768 }
769 
770 //------------------------------------------------------------------------------
771 // Name: is_even
772 //------------------------------------------------------------------------------
773 bool knumber_integer::is_even() const {
774  return mpz_even_p(mpz_);
775 }
776 
777 //------------------------------------------------------------------------------
778 // Name: is_odd
779 //------------------------------------------------------------------------------
780 bool knumber_integer::is_odd() const {
781  return mpz_odd_p(mpz_);
782 }
783 
784 //------------------------------------------------------------------------------
785 // Name: reciprocal
786 //------------------------------------------------------------------------------
787 knumber_base *knumber_integer::reciprocal() {
788  knumber_fraction *q = new knumber_fraction(this);
789  delete this;
790  return q->reciprocal();
791 }
792 
793 //------------------------------------------------------------------------------
794 // Name: log2
795 //------------------------------------------------------------------------------
796 knumber_base *knumber_integer::log2() {
797  knumber_float *f = new knumber_float(this);
798  delete this;
799  return f->log2();
800 }
801 
802 //------------------------------------------------------------------------------
803 // Name: floor
804 //------------------------------------------------------------------------------
805 knumber_base *knumber_integer::floor() {
806  // should have no effect on the value
807  return this;
808 }
809 
810 //------------------------------------------------------------------------------
811 // Name: ceil
812 //------------------------------------------------------------------------------
813 knumber_base *knumber_integer::ceil() {
814  // should have no effect on the value
815  return this;
816 }
817 
818 //------------------------------------------------------------------------------
819 // Name: log10
820 //------------------------------------------------------------------------------
821 knumber_base *knumber_integer::log10() {
822  knumber_float *f = new knumber_float(this);
823  delete this;
824  return f->log10();
825 }
826 
827 //------------------------------------------------------------------------------
828 // Name: ln
829 //------------------------------------------------------------------------------
830 knumber_base *knumber_integer::ln() {
831  knumber_float *f = new knumber_float(this);
832  delete this;
833  return f->ln();
834 }
835 
836 //------------------------------------------------------------------------------
837 // Name: exp2
838 //------------------------------------------------------------------------------
839 knumber_base *knumber_integer::exp2() {
840  knumber_float *f = new knumber_float(this);
841  delete this;
842  return f->exp2();
843 }
844 
845 //------------------------------------------------------------------------------
846 // Name: exp10
847 //------------------------------------------------------------------------------
848 knumber_base *knumber_integer::exp10() {
849  knumber_float *f = new knumber_float(this);
850  delete this;
851  return f->exp10();
852 }
853 
854 //------------------------------------------------------------------------------
855 // Name: exp
856 //------------------------------------------------------------------------------
857 knumber_base *knumber_integer::exp() {
858  knumber_float *f = new knumber_float(this);
859  delete this;
860  return f->exp();
861 }
862 
863 //------------------------------------------------------------------------------
864 // Name: bin
865 //------------------------------------------------------------------------------
866 knumber_base *knumber_integer::bin(knumber_base *rhs) {
867 
868 
869  if(knumber_integer *const p = dynamic_cast<knumber_integer *>(rhs)) {
870  mpz_bin_ui(mpz_, mpz_, mpz_get_ui(p->mpz_));
871  return this;
872 
873  } else if(knumber_float *const p = dynamic_cast<knumber_float *>(rhs)) {
874  delete this;
875  return new knumber_error(knumber_error::ERROR_UNDEFINED);
876  } else if(knumber_fraction *const p = dynamic_cast<knumber_fraction *>(rhs)) {
877  delete this;
878  return new knumber_error(knumber_error::ERROR_UNDEFINED);
879  } else if(knumber_error *const p = dynamic_cast<knumber_error *>(rhs)) {
880  delete this;
881  return new knumber_error(knumber_error::ERROR_UNDEFINED);
882  }
883 
884  Q_ASSERT(0);
885  return 0;
886 }
887 
888 }
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:830
detail::knumber_float::cosh
virtual knumber_base * cosh()
Definition: knumber_float.cpp:647
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:821
detail::knumber_integer::toInt64
virtual qint64 toInt64() const
Definition: knumber_integer.cpp:733
detail::knumber_integer::sinh
virtual knumber_base * sinh()
Definition: knumber_integer.cpp:606
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:664
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:740
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:375
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:529
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:964
detail::knumber_fraction::reciprocal
virtual knumber_base * reciprocal()
Definition: knumber_fraction.cpp:799
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:651
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:642
detail::knumber_integer::is_odd
virtual bool is_odd() const
Definition: knumber_integer.cpp:780
detail::knumber_integer::reciprocal
virtual knumber_base * reciprocal()
Definition: knumber_integer.cpp:787
detail::knumber_float::pow
virtual knumber_base * pow(knumber_base *rhs)
Definition: knumber_float.cpp:757
detail::knumber_float::cbrt
virtual knumber_base * cbrt()
Definition: knumber_float.cpp:397
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:674
detail::knumber_integer::bin
virtual knumber_base * bin(knumber_base *rhs)
Definition: knumber_integer.cpp:866
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:796
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:708
detail::knumber_float::sin
virtual knumber_base * sin()
Definition: knumber_float.cpp:439
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_integer::ceil
virtual knumber_base * ceil()
Definition: knumber_integer.cpp:813
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:920
detail::knumber_fraction::pow
virtual knumber_base * pow(knumber_base *rhs)
Definition: knumber_fraction.cpp:435
detail::knumber_float::tgamma
virtual knumber_base * tgamma()
Definition: knumber_float.cpp:681
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:773
detail::knumber_integer::is_zero
virtual bool is_zero() const
Definition: knumber_integer.cpp:759
detail::knumber_integer::exp2
virtual knumber_base * exp2()
Definition: knumber_integer.cpp:839
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:857
detail::knumber_integer::exp10
virtual knumber_base * exp10()
Definition: knumber_integer.cpp:848
detail::knumber_float::bitwise_or
virtual knumber_base * bitwise_or(knumber_base *rhs)
Definition: knumber_float.cpp:327
QString
QString::toULongLong
qulonglong toULongLong(bool *ok, int base) const
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:706
detail::knumber_float::exp2
virtual knumber_base * exp2()
Definition: knumber_float.cpp:942
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:579
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:986
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:898
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:723
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:606
detail::knumber_integer::tan
virtual knumber_base * tan()
Definition: knumber_integer.cpp:556
QLatin1String
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:695
detail::knumber_float::cos
virtual knumber_base * cos()
Definition: knumber_float.cpp:506
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:552
detail::knumber_integer::floor
virtual knumber_base * floor()
Definition: knumber_integer.cpp:805
detail::knumber_float
Definition: knumber_float.h:28
detail::knumber_integer::tanh
virtual knumber_base * tanh()
Definition: knumber_integer.cpp:624
knumber_error.h
QScopedArrayPointer
knumber_float.h
detail::knumber_error
Definition: knumber_error.h:28
detail::knumber_integer::sign
virtual int sign() const
Definition: knumber_integer.cpp:766
detail::knumber_float::sinh
virtual knumber_base * sinh()
Definition: knumber_float.cpp:629
detail::knumber_integer::cosh
virtual knumber_base * cosh()
Definition: knumber_integer.cpp:615
detail::knumber_float::log2
virtual knumber_base * log2()
Definition: knumber_float.cpp:876
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:660
detail::knumber_integer::asinh
virtual knumber_base * asinh()
Definition: knumber_integer.cpp:633
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:752
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
QString::toLongLong
qlonglong toLongLong(bool *ok, int base) const
detail::knumber_error::neg
virtual knumber_base * neg()
Definition: knumber_error.cpp:300
QString::toAscii
QByteArray toAscii() const
detail::knumber_integer::tgamma
virtual knumber_base * tgamma()
Definition: knumber_integer.cpp:596
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:42:28 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
  • ktimer
  • kwallet
  • 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