• 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.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.h"
21 #include "knumber_base.h"
22 #include "knumber_error.h"
23 #include "knumber_float.h"
24 #include "knumber_fraction.h"
25 #include "knumber_integer.h"
26 #include <QDebug>
27 #include <QRegExp>
28 #include <QStringList>
29 #include <cmath>
30 
31 QString KNumber::GroupSeparator = QLatin1String(",");
32 QString KNumber::DecimalSeparator = QLatin1String(".");
33 
34 const KNumber KNumber::Zero(QLatin1String("0"));
35 const KNumber KNumber::One(QLatin1String("1"));
36 const KNumber KNumber::NegOne(QLatin1String("-1"));
37 const KNumber KNumber::PosInfinity(QLatin1String("inf"));
38 const KNumber KNumber::NegInfinity(QLatin1String("-inf"));
39 const KNumber KNumber::NaN(QLatin1String("nan"));
40 
41 namespace {
42 namespace impl {
43 
44 //------------------------------------------------------------------------------
45 // Name:
46 //------------------------------------------------------------------------------
47 void increment(QString &str, int position) {
48 
49  for (int i = position; i >= 0; i--) {
50  const char last_char = str[i].toLatin1();
51  switch (last_char) {
52  case '0':
53  str[i] = QLatin1Char('1');
54  break;
55  case '1':
56  str[i] = QLatin1Char('2');
57  break;
58  case '2':
59  str[i] = QLatin1Char('3');
60  break;
61  case '3':
62  str[i] = QLatin1Char('4');
63  break;
64  case '4':
65  str[i] = QLatin1Char('5');
66  break;
67  case '5':
68  str[i] = QLatin1Char('6');
69  break;
70  case '6':
71  str[i] = QLatin1Char('7');
72  break;
73  case '7':
74  str[i] = QLatin1Char('8');
75  break;
76  case '8':
77  str[i] = QLatin1Char('9');
78  break;
79  case '9':
80  str[i] = QLatin1Char('0');
81  if (i == 0) {
82  str.prepend(QLatin1Char('1'));
83  }
84  continue;
85  case '.':
86  continue;
87  }
88  break;
89  }
90 }
91 
92 //------------------------------------------------------------------------------
93 // Name:
94 //------------------------------------------------------------------------------
95 void round(QString &str, int precision) {
96 
97  // Cut off if more digits in fractional part than 'precision'
98 
99  int decimalSymbolPos = str.indexOf(QLatin1Char('.'));
100 
101  if (decimalSymbolPos == -1) {
102  if (precision == 0) {
103  return;
104  } else if (precision > 0) { // add dot if missing (and needed)
105  str.append(QLatin1Char('.'));
106  decimalSymbolPos = str.length() - 1;
107  }
108  }
109 
110  // fill up with more than enough zeroes (in case fractional part too short)
111  str.append(QString().fill(QLatin1Char('0'), precision));
112 
113  // Now decide whether to round up or down
114  const char last_char = str[decimalSymbolPos + precision + 1].toLatin1();
115  switch (last_char) {
116  case '0':
117  case '1':
118  case '2':
119  case '3':
120  case '4':
121  // nothing to do, rounding down
122  break;
123  case '5':
124  case '6':
125  case '7':
126  case '8':
127  case '9':
128  // rounding up
129  increment(str, decimalSymbolPos + precision);
130  break;
131  default:
132  break;
133  }
134 
135  decimalSymbolPos = str.indexOf(QLatin1Char('.'));
136  str.truncate(decimalSymbolPos + precision + 1);
137 
138  // if precision == 0 delete also '.'
139  if (precision == 0) {
140  str = str.section(QLatin1Char('.'), 0, 0);
141  }
142 }
143 }
144 
145 //------------------------------------------------------------------------------
146 // Name:
147 //------------------------------------------------------------------------------
148 QString round(const QString &s, int precision) {
149 
150  QString tmp = s;
151  if (precision < 0 || !QRegExp(QLatin1String("^[+-]?\\d+(\\.\\d+)*(e[+-]?\\d+)?$")).exactMatch(tmp)) {
152  return s;
153  }
154 
155  // Skip the sign (for now)
156  const bool neg = (tmp[0] == QLatin1Char('-'));
157  if (neg || tmp[0] == QLatin1Char('+')) {
158  tmp.remove(0, 1);
159  }
160 
161  // Split off exponential part (including 'e'-symbol)
162  QString mantString = tmp.section(QLatin1Char('e'), 0, 0, QString::SectionCaseInsensitiveSeps);
163  QString expString = tmp.section(QLatin1Char('e'), 1, 1, QString::SectionCaseInsensitiveSeps | QString::SectionIncludeLeadingSep);
164 
165  if (expString.length() == 1) {
166  expString.clear();
167  }
168 
169  impl::round(mantString, precision);
170 
171  if (neg) {
172  mantString.prepend(QLatin1Char('-'));
173  }
174 
175  return mantString + expString;
176 }
177 }
178 
179 //------------------------------------------------------------------------------
180 // Name:
181 //------------------------------------------------------------------------------
182 void KNumber::setGroupSeparator(const QString &ch) {
183  GroupSeparator = ch;
184 }
185 
186 //------------------------------------------------------------------------------
187 // Name:
188 //------------------------------------------------------------------------------
189 void KNumber::setDecimalSeparator(const QString &ch) {
190  DecimalSeparator = ch;
191 }
192 
193 //------------------------------------------------------------------------------
194 // Name:
195 //------------------------------------------------------------------------------
196 QString KNumber::groupSeparator() {
197  return GroupSeparator;
198 }
199 
200 //------------------------------------------------------------------------------
201 // Name:
202 //------------------------------------------------------------------------------
203 QString KNumber::decimalSeparator() {
204  return DecimalSeparator;
205 }
206 
207 //------------------------------------------------------------------------------
208 // Name:
209 //------------------------------------------------------------------------------
210 void KNumber::setDefaultFloatPrecision(int precision) {
211  // Need to transform decimal digits into binary digits
212  const unsigned long int bin_prec = static_cast<unsigned long int>(double(precision) * M_LN10 / M_LN2 + 1);
213  mpf_set_default_prec(bin_prec);
214 }
215 
216 //------------------------------------------------------------------------------
217 // Name:
218 //------------------------------------------------------------------------------
219 void KNumber::setSplitoffIntegerForFractionOutput(bool x) {
220  detail::knumber_fraction::set_split_off_integer_for_fraction_output(x);
221 }
222 
223 //------------------------------------------------------------------------------
224 // Name:
225 //------------------------------------------------------------------------------
226 void KNumber::setDefaultFractionalInput(bool x) {
227  detail::knumber_fraction::set_default_fractional_input(x);
228 }
229 
230 //------------------------------------------------------------------------------
231 // Name:
232 //------------------------------------------------------------------------------
233 void KNumber::setDefaultFloatOutput(bool x) {
234  detail::knumber_fraction::set_default_fractional_output(!x);
235 }
236 
237 //------------------------------------------------------------------------------
238 // Name:
239 //------------------------------------------------------------------------------
240 KNumber KNumber::Pi() {
241 
242  // TODO: after 4.10 release:
243  // create a new constructor which works just like the normal QString
244  // accepting constructor, but allows us to specify separator
245  // characters, this will allow things to be done slightly more
246  // efficiently
247  QString s(QLatin1String("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068"));
248  s.replace('.', DecimalSeparator);
249  return KNumber(s);
250 }
251 
252 //------------------------------------------------------------------------------
253 // Name:
254 //------------------------------------------------------------------------------
255 KNumber KNumber::Euler() {
256 
257  // TODO: after 4.10 release:
258  // create a new constructor which works just like the normal QString
259  // accepting constructor, but allows us to specify separator
260  // characters, this will allow things to be done slightly more
261  // efficiently
262  QString s(QLatin1String("2.7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274"));
263  s.replace('.', DecimalSeparator);
264  return KNumber(s);
265 }
266 
267 //------------------------------------------------------------------------------
268 // Name:
269 //------------------------------------------------------------------------------
270 KNumber::KNumber() : value_(new detail::knumber_integer(0)) {
271 }
272 
273 //------------------------------------------------------------------------------
274 // Name:
275 //------------------------------------------------------------------------------
276 KNumber::KNumber(const QString &s) : value_(0) {
277 
278  const QRegExp special_regex(QLatin1String("^(inf|-inf|nan)$"));
279  const QRegExp integer_regex(QLatin1String("^[+-]?\\d+$"));
280  const QRegExp fraction_regex(QLatin1String("^[+-]?\\d+/\\d+$"));
281  const QRegExp float_regex(QString(QLatin1String("^([+-]?\\d*)(%1\\d*)?(e([+-]?\\d+))?$")).arg(QRegExp::escape(DecimalSeparator)));
282 
283  if (special_regex.exactMatch(s)) {
284  value_ = new detail::knumber_error(s);
285  } else if (integer_regex.exactMatch(s)) {
286  value_ = new detail::knumber_integer(s);
287  } else if (fraction_regex.exactMatch(s)) {
288  value_ = new detail::knumber_fraction(s);
289  simplify();
290  } else if (float_regex.exactMatch(s)) {
291 
292  if(detail::knumber_fraction::default_fractional_input) {
293 
294  const QStringList list = float_regex.capturedTexts();
295  if(list.size() == 5) {
296 
297  const QString ipart = list[1];
298  const QString fpart = list[2];
299  const QString epart = list[3];
300  const int e_val = list[4].toInt();
301 
302  QString num = ipart + fpart.mid(1);
303  QString den = QLatin1String("1") + QString(fpart.size() - 1, QLatin1Char('0'));
304 
305  if(e_val < 0) {
306  den = den + QString(::abs(e_val), QLatin1Char('0'));
307  } else if(e_val > 0) {
308  num = num + QString(::abs(e_val), QLatin1Char('0'));
309  }
310 
311  value_ = new detail::knumber_fraction(QString(QLatin1String("%1/%2")).arg(num, den));
312  simplify();
313  return;
314  }
315  }
316 
317  // we need to normalize the decimal searator to US style because that's
318  // the only type that the GMP function accept
319  QString new_s = s;
320  new_s.replace(DecimalSeparator, QLatin1String("."));
321 
322  value_ = new detail::knumber_float(new_s);
323  simplify();
324  } else {
325  value_ = new detail::knumber_error(detail::knumber_error::ERROR_UNDEFINED);
326  }
327 }
328 
329 //------------------------------------------------------------------------------
330 // Name:
331 //------------------------------------------------------------------------------
332 KNumber::KNumber(qint32 value) : value_(new detail::knumber_integer(value)) {
333 }
334 
335 //------------------------------------------------------------------------------
336 // Name:
337 //------------------------------------------------------------------------------
338 KNumber::KNumber(qint64 value) : value_(new detail::knumber_integer(value)) {
339 }
340 
341 //------------------------------------------------------------------------------
342 // Name:
343 //------------------------------------------------------------------------------
344 KNumber::KNumber(quint32 value) : value_(new detail::knumber_integer(value)) {
345 }
346 
347 //------------------------------------------------------------------------------
348 // Name:
349 //------------------------------------------------------------------------------
350 KNumber::KNumber(quint64 value) : value_(new detail::knumber_integer(value)) {
351 }
352 
353 //------------------------------------------------------------------------------
354 // Name:
355 //------------------------------------------------------------------------------
356 KNumber::KNumber(qint64 num, quint64 den) : value_(new detail::knumber_fraction(num, den)) {
357 }
358 
359 //------------------------------------------------------------------------------
360 // Name:
361 //------------------------------------------------------------------------------
362 KNumber::KNumber(quint64 num, quint64 den) : value_(new detail::knumber_fraction(num, den)) {
363 }
364 
365 #ifdef HAVE_LONG_DOUBLE
366 //------------------------------------------------------------------------------
367 // Name:
368 //------------------------------------------------------------------------------
369 KNumber::KNumber(long double value) : value_(new detail::knumber_float(value)) {
370  simplify();
371 }
372 #endif
373 
374 //------------------------------------------------------------------------------
375 // Name:
376 //------------------------------------------------------------------------------
377 KNumber::KNumber(double value) : value_(new detail::knumber_float(value)) {
378  simplify();
379 }
380 
381 //------------------------------------------------------------------------------
382 // Name:
383 //------------------------------------------------------------------------------
384 KNumber::KNumber(const KNumber &other) : value_(0) {
385  if(&other != this) {
386  value_ = other.value_->clone();
387  }
388 }
389 
390 //------------------------------------------------------------------------------
391 // Name:
392 //------------------------------------------------------------------------------
393 KNumber::~KNumber() {
394  delete value_;
395 }
396 
397 //------------------------------------------------------------------------------
398 // Name:
399 //------------------------------------------------------------------------------
400 KNumber::Type KNumber::type() const {
401 
402  if(dynamic_cast<detail::knumber_integer *>(value_)) {
403  return TYPE_INTEGER;
404  } else if(dynamic_cast<detail::knumber_float *>(value_)) {
405  return TYPE_FLOAT;
406  } else if(dynamic_cast<detail::knumber_fraction *>(value_)) {
407  return TYPE_FRACTION;
408  } else if(dynamic_cast<detail::knumber_error *>(value_)) {
409  return TYPE_ERROR;
410  } else {
411  Q_ASSERT(0);
412  return TYPE_ERROR;
413  }
414 }
415 
416 //------------------------------------------------------------------------------
417 // Name:
418 //------------------------------------------------------------------------------
419 KNumber &KNumber::operator=(const KNumber &rhs) {
420  KNumber(rhs).swap(*this);
421  return *this;
422 }
423 
424 //------------------------------------------------------------------------------
425 // Name:
426 //------------------------------------------------------------------------------
427 void KNumber::swap(KNumber &other) {
428  qSwap(value_, other.value_);
429 }
430 
431 //------------------------------------------------------------------------------
432 // Name:
433 //------------------------------------------------------------------------------
434 KNumber KNumber::integerPart() const {
435 
436  KNumber x(*this);
437 
438  if(detail::knumber_integer *const p = dynamic_cast<detail::knumber_integer *>(value_)) {
439  // NO-OP
440  Q_UNUSED(p);
441  } else if(detail::knumber_float *const p = dynamic_cast<detail::knumber_float *>(value_)) {
442  detail::knumber_base *v = new detail::knumber_integer(p);
443  qSwap(v, x.value_);
444  delete v;
445  } else if(detail::knumber_fraction *const p = dynamic_cast<detail::knumber_fraction *>(value_)) {
446  detail::knumber_base *v = new detail::knumber_integer(p);
447  qSwap(v, x.value_);
448  delete v;
449  } else if(detail::knumber_error *const p = dynamic_cast<detail::knumber_error *>(value_)) {
450  // NO-OP
451  Q_UNUSED(p);
452  } else {
453  Q_ASSERT(0);
454  }
455 
456  return x;
457 }
458 
459 //------------------------------------------------------------------------------
460 // Name:
461 //------------------------------------------------------------------------------
462 void KNumber::simplify() {
463 
464  if(value_->is_integer()) {
465 
466  if(detail::knumber_integer *const p = dynamic_cast<detail::knumber_integer *>(value_)) {
467  // NO-OP
468  Q_UNUSED(p);
469  } else if(detail::knumber_float *const p = dynamic_cast<detail::knumber_float *>(value_)) {
470  detail::knumber_base *v = new detail::knumber_integer(p);
471  qSwap(v, value_);
472  delete v;
473  } else if(detail::knumber_fraction *const p = dynamic_cast<detail::knumber_fraction *>(value_)) {
474  detail::knumber_base *v = new detail::knumber_integer(p);
475  qSwap(v, value_);
476  delete v;
477  } else if(detail::knumber_error *const p = dynamic_cast<detail::knumber_error *>(value_)) {
478  // NO-OP
479  Q_UNUSED(p);
480  } else {
481  Q_ASSERT(0);
482  }
483  }
484 }
485 
486 //------------------------------------------------------------------------------
487 // Name:
488 //------------------------------------------------------------------------------
489 KNumber &KNumber::operator+=(const KNumber &rhs) {
490  value_ = value_->add(rhs.value_);
491  simplify();
492  return *this;
493 }
494 
495 //------------------------------------------------------------------------------
496 // Name:
497 //------------------------------------------------------------------------------
498 KNumber &KNumber::operator-=(const KNumber &rhs) {
499  value_ = value_->sub(rhs.value_);
500  simplify();
501  return *this;
502 }
503 
504 //------------------------------------------------------------------------------
505 // Name:
506 //------------------------------------------------------------------------------
507 KNumber &KNumber::operator*=(const KNumber &rhs) {
508  value_ = value_->mul(rhs.value_);
509  simplify();
510  return *this;
511 }
512 
513 //------------------------------------------------------------------------------
514 // Name:
515 //------------------------------------------------------------------------------
516 KNumber &KNumber::operator/=(const KNumber &rhs) {
517  value_ = value_->div(rhs.value_);
518  simplify();
519  return *this;
520 }
521 
522 //------------------------------------------------------------------------------
523 // Name:
524 //------------------------------------------------------------------------------
525 KNumber &KNumber::operator%=(const KNumber &rhs) {
526  value_ = value_->mod(rhs.value_);
527  simplify();
528  return *this;
529 }
530 
531 //------------------------------------------------------------------------------
532 // Name:
533 //------------------------------------------------------------------------------
534 KNumber &KNumber::operator&=(const KNumber &rhs) {
535  value_ = value_->bitwise_and(rhs.value_);
536  return *this;
537 }
538 
539 //------------------------------------------------------------------------------
540 // Name:
541 //------------------------------------------------------------------------------
542 KNumber &KNumber::operator|=(const KNumber &rhs) {
543  value_ = value_->bitwise_or(rhs.value_);
544  return *this;
545 }
546 
547 //------------------------------------------------------------------------------
548 // Name:
549 //------------------------------------------------------------------------------
550 KNumber &KNumber::operator^=(const KNumber &rhs) {
551  value_ = value_->bitwise_xor(rhs.value_);
552  return *this;
553 }
554 
555 //------------------------------------------------------------------------------
556 // Name:
557 //------------------------------------------------------------------------------
558 KNumber &KNumber::operator<<=(const KNumber &rhs) {
559  value_ = value_->bitwise_shift(rhs.value_);
560  return *this;
561 }
562 
563 //------------------------------------------------------------------------------
564 // Name:
565 //------------------------------------------------------------------------------
566 KNumber &KNumber::operator>>=(const KNumber &rhs) {
567  const KNumber rhs_neg(-rhs);
568  value_ = value_->bitwise_shift(rhs_neg.value_);
569  return *this;
570 }
571 
572 //------------------------------------------------------------------------------
573 // Name:
574 //------------------------------------------------------------------------------
575 KNumber KNumber::operator-() const {
576  KNumber x(*this);
577  x.value_ = x.value_->neg();
578  return x;
579 }
580 
581 //------------------------------------------------------------------------------
582 // Name:
583 //------------------------------------------------------------------------------
584 KNumber KNumber::operator~() const {
585  KNumber x(*this);
586  x.value_ = x.value_->cmp();
587  return x;
588 }
589 
590 //------------------------------------------------------------------------------
591 // Name:
592 //------------------------------------------------------------------------------
593 QString KNumber::toQString(int width, int precision) const {
594 
595  if(value_->is_zero()) {
596  return QLatin1String("0");
597  }
598 
599  QString s;
600 
601  if(detail::knumber_integer *const p = dynamic_cast<detail::knumber_integer *>(value_)) {
602  if(width > 0) {
603  s = detail::knumber_float(p).toString(width);
604  } else {
605  s = value_->toString(width);
606  }
607  } else if(detail::knumber_float *const p = dynamic_cast<detail::knumber_float *>(value_)) {
608  if(width > 0) {
609  s = value_->toString(width);
610  } else {
611  s = value_->toString(3 * mpf_get_default_prec() / 10);
612  }
613  } else if(detail::knumber_fraction *const p = dynamic_cast<detail::knumber_fraction *>(value_)) {
614  s = value_->toString(width);
615  } else {
616  return value_->toString(width);
617  }
618 
619  // now do some rounding to make sure things are displayed reasonably
620  if (precision >= 0) {
621  return round(s, precision);
622  } else {
623  return s;
624  }
625 }
626 
627 //------------------------------------------------------------------------------
628 // Name:
629 //------------------------------------------------------------------------------
630 quint64 KNumber::toUint64() const {
631  return value_->toUint64();
632 }
633 
634 //------------------------------------------------------------------------------
635 // Name:
636 //------------------------------------------------------------------------------
637 qint64 KNumber::toInt64() const {
638  return value_->toInt64();
639 }
640 
641 //------------------------------------------------------------------------------
642 // Name:
643 //------------------------------------------------------------------------------
644 KNumber KNumber::abs() const {
645  KNumber z(*this);
646  z.value_ = z.value_->abs();
647  z.simplify();
648  return z;
649 }
650 
651 //------------------------------------------------------------------------------
652 // Name:
653 //------------------------------------------------------------------------------
654 KNumber KNumber::cbrt() const {
655  KNumber z(*this);
656  z.value_ = z.value_->cbrt();
657  z.simplify();
658  return z;
659 }
660 
661 //------------------------------------------------------------------------------
662 // Name:
663 //------------------------------------------------------------------------------
664 KNumber KNumber::sqrt() const {
665  KNumber z(*this);
666  z.value_ = z.value_->sqrt();
667  z.simplify();
668  return z;
669 }
670 
671 //------------------------------------------------------------------------------
672 // Name:
673 //------------------------------------------------------------------------------
674 KNumber KNumber::pow(const KNumber &x) const {
675 
676  // if the LHS is a special then we can use this function
677  // no matter what, cause the result is a special too
678  if(!dynamic_cast<detail::knumber_error *>(value_)) {
679  // number much bigger than this tend to crash GMP with
680  // an abort
681  if(x > KNumber(QLatin1String("1000000000"))) {
682  return PosInfinity;
683  }
684  }
685 
686  KNumber z(*this);
687  z.value_ = z.value_->pow(x.value_);
688  z.simplify();
689  return z;
690 }
691 
692 //------------------------------------------------------------------------------
693 // Name:
694 //------------------------------------------------------------------------------
695 KNumber KNumber::sin() const {
696  KNumber z(*this);
697  z.value_ = z.value_->sin();
698  z.simplify();
699  return z;
700 }
701 
702 //------------------------------------------------------------------------------
703 // Name:
704 //------------------------------------------------------------------------------
705 KNumber KNumber::cos() const {
706  KNumber z(*this);
707  z.value_ = z.value_->cos();
708  z.simplify();
709  return z;
710 }
711 
712 //------------------------------------------------------------------------------
713 // Name:
714 //------------------------------------------------------------------------------
715 KNumber KNumber::tan() const {
716  KNumber z(*this);
717  z.value_ = z.value_->tan();
718  z.simplify();
719  return z;
720 }
721 
722 //------------------------------------------------------------------------------
723 // Name:
724 //------------------------------------------------------------------------------
725 KNumber KNumber::asin() const {
726  KNumber z(*this);
727  z.value_ = z.value_->asin();
728  z.simplify();
729  return z;
730 }
731 
732 //------------------------------------------------------------------------------
733 // Name:
734 //------------------------------------------------------------------------------
735 KNumber KNumber::acos() const {
736  KNumber z(*this);
737  z.value_ = z.value_->acos();
738  z.simplify();
739  return z;
740 }
741 
742 //------------------------------------------------------------------------------
743 // Name:
744 //------------------------------------------------------------------------------
745 KNumber KNumber::atan() const {
746  KNumber z(*this);
747  z.value_ = z.value_->atan();
748  z.simplify();
749  return z;
750 }
751 
752 //------------------------------------------------------------------------------
753 // Name:
754 //------------------------------------------------------------------------------
755 KNumber KNumber::sinh() const {
756  KNumber z(*this);
757  z.value_ = z.value_->sinh();
758  z.simplify();
759  return z;
760 }
761 
762 //------------------------------------------------------------------------------
763 // Name:
764 //------------------------------------------------------------------------------
765 KNumber KNumber::cosh() const {
766  KNumber z(*this);
767  z.value_ = z.value_->cosh();
768  z.simplify();
769  return z;
770 }
771 
772 //------------------------------------------------------------------------------
773 // Name:
774 //------------------------------------------------------------------------------
775 KNumber KNumber::tanh() const {
776  KNumber z(*this);
777  z.value_ = z.value_->tanh();
778  z.simplify();
779  return z;
780 }
781 
782 //------------------------------------------------------------------------------
783 // Name:
784 //------------------------------------------------------------------------------
785 KNumber KNumber::asinh() const {
786  KNumber z(*this);
787  z.value_ = z.value_->asinh();
788  z.simplify();
789  return z;
790 }
791 
792 //------------------------------------------------------------------------------
793 // Name:
794 //------------------------------------------------------------------------------
795 KNumber KNumber::acosh() const {
796  KNumber z(*this);
797  z.value_ = z.value_->acosh();
798  z.simplify();
799  return z;
800 }
801 
802 //------------------------------------------------------------------------------
803 // Name:
804 //------------------------------------------------------------------------------
805 KNumber KNumber::atanh() const {
806  KNumber z(*this);
807  z.value_ = z.value_->atanh();
808  z.simplify();
809  return z;
810 }
811 
812 //------------------------------------------------------------------------------
813 // Name:
814 //------------------------------------------------------------------------------
815 KNumber KNumber::factorial() const {
816  KNumber z(*this);
817 
818  // number much bigger than this tend to crash GMP with
819  // an abort
820  if(z > KNumber(QLatin1String("10000000000"))) {
821  return PosInfinity;
822  }
823 
824  z.value_ = z.value_->factorial();
825  z.simplify();
826  return z;
827 }
828 
829 //------------------------------------------------------------------------------
830 // Name:
831 //------------------------------------------------------------------------------
832 KNumber KNumber::log2() const {
833  KNumber z(*this);
834  z.value_ = z.value_->log2();
835  z.simplify();
836  return z;
837 }
838 
839 //------------------------------------------------------------------------------
840 // Name:
841 //------------------------------------------------------------------------------
842 KNumber KNumber::log10() const {
843  KNumber z(*this);
844  z.value_ = z.value_->log10();
845  z.simplify();
846  return z;
847 }
848 
849 //------------------------------------------------------------------------------
850 // Name:
851 //------------------------------------------------------------------------------
852 KNumber KNumber::ln() const {
853  KNumber z(*this);
854  z.value_ = z.value_->ln();
855  z.simplify();
856  return z;
857 }
858 
859 //------------------------------------------------------------------------------
860 // Name:
861 //------------------------------------------------------------------------------
862 KNumber KNumber::exp2() const {
863  KNumber z(*this);
864  z.value_ = z.value_->exp2();
865  z.simplify();
866  return z;
867 }
868 
869 //------------------------------------------------------------------------------
870 // Name:
871 //------------------------------------------------------------------------------
872 KNumber KNumber::exp10() const {
873  KNumber z(*this);
874  z.value_ = z.value_->exp10();
875  z.simplify();
876  return z;
877 }
878 
879 //------------------------------------------------------------------------------
880 // Name:
881 //------------------------------------------------------------------------------
882 KNumber KNumber::exp() const {
883  KNumber z(*this);
884  z.value_ = z.value_->exp();
885  z.simplify();
886  return z;
887 }
888 
889 //------------------------------------------------------------------------------
890 // Name:
891 //------------------------------------------------------------------------------
892 KNumber KNumber::bin(const KNumber &x) const {
893  KNumber z(*this);
894  z.value_ = z.value_->bin(x.value_);
895  z.simplify();
896  return z;
897 }
detail::knumber_base::tanh
virtual knumber_base * tanh()=0
KNumber::exp2
KNumber exp2() const
Definition: knumber.cpp:862
detail::knumber_base::is_integer
virtual bool is_integer() const =0
detail::knumber_fraction::set_default_fractional_output
static void set_default_fractional_output(bool value)
Definition: knumber_fraction.cpp:43
KNumber::toQString
QString toQString(int width=-1, int precision=-1) const
Definition: knumber.cpp:593
KNumber::pow
KNumber pow(const KNumber &x) const
Definition: knumber.cpp:674
detail::knumber_fraction::set_default_fractional_input
static void set_default_fractional_input(bool value)
Definition: knumber_fraction.cpp:36
detail::knumber_base::bin
virtual knumber_base * bin(knumber_base *rhs)=0
KNumber::NegInfinity
static const KNumber NegInfinity
Definition: knumber.h:54
KNumber::groupSeparator
static QString groupSeparator()
Definition: knumber.cpp:196
KNumber::abs
KNumber abs() const
Definition: knumber.cpp:644
KNumber::asinh
KNumber asinh() const
Definition: knumber.cpp:785
KNumber::atan
KNumber atan() const
Definition: knumber.cpp:745
KNumber::NaN
static const KNumber NaN
Definition: knumber.h:55
detail::knumber_base::toUint64
virtual quint64 toUint64() const =0
KNumber::One
static const KNumber One
Definition: knumber.h:51
KNumber::exp
KNumber exp() const
Definition: knumber.cpp:882
KNumber::decimalSeparator
static QString decimalSeparator()
Definition: knumber.cpp:203
detail::knumber_base::bitwise_or
virtual knumber_base * bitwise_or(knumber_base *rhs)=0
KNumber::operator/=
KNumber & operator/=(const KNumber &rhs)
Definition: knumber.cpp:516
KNumber::operator<<=
KNumber & operator<<=(const KNumber &rhs)
Definition: knumber.cpp:558
KNumber::setGroupSeparator
static void setGroupSeparator(const QString &ch)
Definition: knumber.cpp:182
KNumber::setDefaultFloatOutput
static void setDefaultFloatOutput(bool x)
Definition: knumber.cpp:233
KNumber::Zero
static const KNumber Zero
Definition: knumber.h:50
KNumber::acosh
KNumber acosh() const
Definition: knumber.cpp:795
detail::knumber_base::neg
virtual knumber_base * neg()=0
KNumber::cos
KNumber cos() const
Definition: knumber.cpp:705
KNumber::operator>>=
KNumber & operator>>=(const KNumber &rhs)
Definition: knumber.cpp:566
KNumber::operator-=
KNumber & operator-=(const KNumber &rhs)
Definition: knumber.cpp:498
detail::knumber_base::cbrt
virtual knumber_base * cbrt()=0
detail::knumber_base::add
virtual knumber_base * add(knumber_base *rhs)=0
detail::knumber_base::mod
virtual knumber_base * mod(knumber_base *rhs)=0
detail::knumber_base::exp2
virtual knumber_base * exp2()=0
detail::knumber_base::asinh
virtual knumber_base * asinh()=0
KNumber::TYPE_INTEGER
Definition: knumber.h:43
KNumber::Euler
static KNumber Euler()
Definition: knumber.cpp:255
detail::knumber_base::log10
virtual knumber_base * log10()=0
KNumber::toInt64
qint64 toInt64() const
Definition: knumber.cpp:637
KNumber::integerPart
KNumber integerPart() const
Definition: knumber.cpp:434
detail::knumber_base::sub
virtual knumber_base * sub(knumber_base *rhs)=0
KNumber::TYPE_FRACTION
Definition: knumber.h:45
KNumber::bin
KNumber bin(const KNumber &x) const
Definition: knumber.cpp:892
detail::knumber_base::is_zero
virtual bool is_zero() const =0
detail::knumber_base::cos
virtual knumber_base * cos()=0
KNumber::setDefaultFloatPrecision
static void setDefaultFloatPrecision(int precision)
Definition: knumber.cpp:210
KNumber::operator+=
KNumber & operator+=(const KNumber &rhs)
Definition: knumber.cpp:489
KNumber::log10
KNumber log10() const
Definition: knumber.cpp:842
detail::knumber_base::bitwise_shift
virtual knumber_base * bitwise_shift(knumber_base *rhs)=0
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
Definition: knumber_integer.h:28
detail::knumber_base::atan
virtual knumber_base * atan()=0
KNumber::KNumber
KNumber()
Definition: knumber.cpp:270
detail::knumber_float::toString
virtual QString toString(int precision) const
Definition: knumber_float.cpp:749
KNumber::type
Type type() const
Definition: knumber.cpp:400
detail::knumber_base::exp10
virtual knumber_base * exp10()=0
KNumber::setDefaultFractionalInput
static void setDefaultFractionalInput(bool x)
Definition: knumber.cpp:226
KNumber::log2
KNumber log2() const
Definition: knumber.cpp:832
KNumber::operator&=
KNumber & operator&=(const KNumber &rhs)
Definition: knumber.cpp:534
knumber_fraction.h
KNumber::exp10
KNumber exp10() const
Definition: knumber.cpp:872
detail::knumber_base::sqrt
virtual knumber_base * sqrt()=0
KNumber::setSplitoffIntegerForFractionOutput
static void setSplitoffIntegerForFractionOutput(bool x)
Definition: knumber.cpp:219
detail::knumber_base::abs
virtual knumber_base * abs()=0
detail::knumber_base::toInt64
virtual qint64 toInt64() const =0
KNumber
Definition: knumber.h:31
KNumber::swap
void swap(KNumber &other)
Definition: knumber.cpp:427
knumber_base.h
KNumber::sin
KNumber sin() const
Definition: knumber.cpp:695
KNumber::tan
KNumber tan() const
Definition: knumber.cpp:715
detail::knumber_fraction::set_split_off_integer_for_fraction_output
static void set_split_off_integer_for_fraction_output(bool value)
Definition: knumber_fraction.cpp:50
detail::knumber_base::asin
virtual knumber_base * asin()=0
detail::knumber_base::bitwise_xor
virtual knumber_base * bitwise_xor(knumber_base *rhs)=0
knumber_integer.h
KNumber::operator~
KNumber operator~() const
Definition: knumber.cpp:584
detail::knumber_base::exp
virtual knumber_base * exp()=0
KNumber::toUint64
quint64 toUint64() const
Definition: knumber.cpp:630
KNumber::cosh
KNumber cosh() const
Definition: knumber.cpp:765
KNumber::~KNumber
~KNumber()
Definition: knumber.cpp:393
KNumber::setDecimalSeparator
static void setDecimalSeparator(const QString &ch)
Definition: knumber.cpp:189
KNumber::operator|=
KNumber & operator|=(const KNumber &rhs)
Definition: knumber.cpp:542
KNumber::PosInfinity
static const KNumber PosInfinity
Definition: knumber.h:53
KNumber::operator=
KNumber & operator=(const KNumber &rhs)
Definition: knumber.cpp:419
KNumber::cbrt
KNumber cbrt() const
Definition: knumber.cpp:654
KNumber::factorial
KNumber factorial() const
Definition: knumber.cpp:815
KNumber::operator*=
KNumber & operator*=(const KNumber &rhs)
Definition: knumber.cpp:507
detail::knumber_base::acos
virtual knumber_base * acos()=0
detail::knumber_fraction::default_fractional_input
static bool default_fractional_input
Definition: knumber_fraction.h:35
detail::knumber_float
Definition: knumber_float.h:28
detail::knumber_base::sinh
virtual knumber_base * sinh()=0
knumber_error.h
detail::knumber_base::acosh
virtual knumber_base * acosh()=0
KNumber::Pi
static KNumber Pi()
Definition: knumber.cpp:240
detail::knumber_base::tan
virtual knumber_base * tan()=0
detail::knumber_base::toString
virtual QString toString(int precision) const =0
knumber_float.h
KNumber::asin
KNumber asin() const
Definition: knumber.cpp:725
KNumber::TYPE_FLOAT
Definition: knumber.h:44
KNumber::ln
KNumber ln() const
Definition: knumber.cpp:852
detail::knumber_base::ln
virtual knumber_base * ln()=0
detail::knumber_error
Definition: knumber_error.h:28
detail::knumber_base::pow
virtual knumber_base * pow(knumber_base *rhs)=0
detail::knumber_base::mul
virtual knumber_base * mul(knumber_base *rhs)=0
KNumber::acos
KNumber acos() const
Definition: knumber.cpp:735
detail::knumber_base::factorial
virtual knumber_base * factorial()=0
KNumber::atanh
KNumber atanh() const
Definition: knumber.cpp:805
detail::knumber_base::cosh
virtual knumber_base * cosh()=0
detail::knumber_base::atanh
virtual knumber_base * atanh()=0
KNumber::operator-
KNumber operator-() const
Definition: knumber.cpp:575
detail::knumber_error::ERROR_UNDEFINED
Definition: knumber_error.h:36
detail::knumber_base::div
virtual knumber_base * div(knumber_base *rhs)=0
detail::knumber_base::bitwise_and
virtual knumber_base * bitwise_and(knumber_base *rhs)=0
KNumber::Type
Type
Definition: knumber.h:41
detail::knumber_base::cmp
virtual knumber_base * cmp()=0
detail::knumber_base::log2
virtual knumber_base * log2()=0
KNumber::NegOne
static const KNumber NegOne
Definition: knumber.h:52
KNumber::sinh
KNumber sinh() const
Definition: knumber.cpp:755
KNumber::sqrt
KNumber sqrt() const
Definition: knumber.cpp:664
KNumber::operator^=
KNumber & operator^=(const KNumber &rhs)
Definition: knumber.cpp:550
KNumber::operator%=
KNumber & operator%=(const KNumber &rhs)
Definition: knumber.cpp:525
KNumber::TYPE_ERROR
Definition: knumber.h:42
detail::knumber_base::sin
virtual knumber_base * sin()=0
knumber.h
KNumber::tanh
KNumber tanh() const
Definition: knumber.cpp:775
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