• 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.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: increment
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: round
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: round
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: setGroupSeparator
181 //------------------------------------------------------------------------------
182 void KNumber::setGroupSeparator(const QString &ch) {
183  GroupSeparator = ch;
184 }
185 
186 //------------------------------------------------------------------------------
187 // Name: setDecimalSeparator
188 //------------------------------------------------------------------------------
189 void KNumber::setDecimalSeparator(const QString &ch) {
190  DecimalSeparator = ch;
191 }
192 
193 //------------------------------------------------------------------------------
194 // Name: groupSeparator
195 //------------------------------------------------------------------------------
196 QString KNumber::groupSeparator() {
197  return GroupSeparator;
198 }
199 
200 //------------------------------------------------------------------------------
201 // Name: decimalSeparator
202 //------------------------------------------------------------------------------
203 QString KNumber::decimalSeparator() {
204  return DecimalSeparator;
205 }
206 
207 //------------------------------------------------------------------------------
208 // Name: setDefaultFloatPrecision
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: setSplitoffIntegerForFractionOutput
218 //------------------------------------------------------------------------------
219 void KNumber::setSplitoffIntegerForFractionOutput(bool x) {
220  detail::knumber_fraction::set_split_off_integer_for_fraction_output(x);
221 }
222 
223 //------------------------------------------------------------------------------
224 // Name: setDefaultFractionalInput
225 //------------------------------------------------------------------------------
226 void KNumber::setDefaultFractionalInput(bool x) {
227  detail::knumber_fraction::set_default_fractional_input(x);
228 }
229 
230 //------------------------------------------------------------------------------
231 // Name: setDefaultFloatOutput
232 //------------------------------------------------------------------------------
233 void KNumber::setDefaultFloatOutput(bool x) {
234  detail::knumber_fraction::set_default_fractional_output(!x);
235 }
236 
237 //------------------------------------------------------------------------------
238 // Name: Pi
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: Euler
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: KNumber
269 //------------------------------------------------------------------------------
270 KNumber::KNumber() : value_(new detail::knumber_integer(0)) {
271 }
272 
273 //------------------------------------------------------------------------------
274 // Name: KNumber
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: KNumber
331 //------------------------------------------------------------------------------
332 KNumber::KNumber(qint32 value) : value_(new detail::knumber_integer(value)) {
333 }
334 
335 //------------------------------------------------------------------------------
336 // Name: KNumber
337 //------------------------------------------------------------------------------
338 KNumber::KNumber(qint64 value) : value_(new detail::knumber_integer(value)) {
339 }
340 
341 //------------------------------------------------------------------------------
342 // Name: KNumber
343 //------------------------------------------------------------------------------
344 KNumber::KNumber(quint32 value) : value_(new detail::knumber_integer(value)) {
345 }
346 
347 //------------------------------------------------------------------------------
348 // Name: KNumber
349 //------------------------------------------------------------------------------
350 KNumber::KNumber(quint64 value) : value_(new detail::knumber_integer(value)) {
351 }
352 
353 //------------------------------------------------------------------------------
354 // Name: KNumber
355 //------------------------------------------------------------------------------
356 KNumber::KNumber(qint64 num, quint64 den) : value_(new detail::knumber_fraction(num, den)) {
357 }
358 
359 //------------------------------------------------------------------------------
360 // Name: KNumber
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: KNumber
368 //------------------------------------------------------------------------------
369 KNumber::KNumber(long double value) : value_(new detail::knumber_float(value)) {
370  simplify();
371 }
372 #endif
373 
374 //------------------------------------------------------------------------------
375 // Name: KNumber
376 //------------------------------------------------------------------------------
377 KNumber::KNumber(double value) : value_(new detail::knumber_float(value)) {
378  simplify();
379 }
380 
381 //------------------------------------------------------------------------------
382 // Name: KNumber
383 //------------------------------------------------------------------------------
384 KNumber::KNumber(const KNumber &other) : value_(0) {
385  if(&other != this) {
386  value_ = other.value_->clone();
387  }
388 }
389 
390 //------------------------------------------------------------------------------
391 // Name: ~KNumber
392 //------------------------------------------------------------------------------
393 KNumber::~KNumber() {
394  delete value_;
395 }
396 
397 //------------------------------------------------------------------------------
398 // Name: type
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: operator=
418 //------------------------------------------------------------------------------
419 KNumber &KNumber::operator=(const KNumber &rhs) {
420  KNumber(rhs).swap(*this);
421  return *this;
422 }
423 
424 //------------------------------------------------------------------------------
425 // Name: swap
426 //------------------------------------------------------------------------------
427 void KNumber::swap(KNumber &other) {
428  qSwap(value_, other.value_);
429 }
430 
431 //------------------------------------------------------------------------------
432 // Name: integerPart
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: simplify
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: operator+=
488 //------------------------------------------------------------------------------
489 KNumber &KNumber::operator+=(const KNumber &rhs) {
490  value_ = value_->add(rhs.value_);
491  simplify();
492  return *this;
493 }
494 
495 //------------------------------------------------------------------------------
496 // Name: operator-=
497 //------------------------------------------------------------------------------
498 KNumber &KNumber::operator-=(const KNumber &rhs) {
499  value_ = value_->sub(rhs.value_);
500  simplify();
501  return *this;
502 }
503 
504 //------------------------------------------------------------------------------
505 // Name: operator*=
506 //------------------------------------------------------------------------------
507 KNumber &KNumber::operator*=(const KNumber &rhs) {
508  value_ = value_->mul(rhs.value_);
509  simplify();
510  return *this;
511 }
512 
513 //------------------------------------------------------------------------------
514 // Name: operator/=
515 //------------------------------------------------------------------------------
516 KNumber &KNumber::operator/=(const KNumber &rhs) {
517 
518  // Fix for bug #330577, x /0 is undefined, not infinity
519  // Also indirectly fixes bug #329897, tan(90) is undefined, not infinity
520  if(rhs == Zero) {
521  *this = NaN;
522  return *this;
523  }
524 
525  value_ = value_->div(rhs.value_);
526  simplify();
527  return *this;
528 }
529 
530 //------------------------------------------------------------------------------
531 // Name: operator%=
532 //------------------------------------------------------------------------------
533 KNumber &KNumber::operator%=(const KNumber &rhs) {
534  value_ = value_->mod(rhs.value_);
535  simplify();
536  return *this;
537 }
538 
539 //------------------------------------------------------------------------------
540 // Name: operator&=
541 //------------------------------------------------------------------------------
542 KNumber &KNumber::operator&=(const KNumber &rhs) {
543  value_ = value_->bitwise_and(rhs.value_);
544  return *this;
545 }
546 
547 //------------------------------------------------------------------------------
548 // Name: operator|=
549 //------------------------------------------------------------------------------
550 KNumber &KNumber::operator|=(const KNumber &rhs) {
551  value_ = value_->bitwise_or(rhs.value_);
552  return *this;
553 }
554 
555 //------------------------------------------------------------------------------
556 // Name: operator^=
557 //------------------------------------------------------------------------------
558 KNumber &KNumber::operator^=(const KNumber &rhs) {
559  value_ = value_->bitwise_xor(rhs.value_);
560  return *this;
561 }
562 
563 //------------------------------------------------------------------------------
564 // Name: operator<<
565 //------------------------------------------------------------------------------
566 KNumber &KNumber::operator<<=(const KNumber &rhs) {
567  value_ = value_->bitwise_shift(rhs.value_);
568  return *this;
569 }
570 
571 //------------------------------------------------------------------------------
572 // Name: operator>>=
573 //------------------------------------------------------------------------------
574 KNumber &KNumber::operator>>=(const KNumber &rhs) {
575  const KNumber rhs_neg(-rhs);
576  value_ = value_->bitwise_shift(rhs_neg.value_);
577  return *this;
578 }
579 
580 //------------------------------------------------------------------------------
581 // Name: operator-
582 //------------------------------------------------------------------------------
583 KNumber KNumber::operator-() const {
584  KNumber x(*this);
585  x.value_ = x.value_->neg();
586  return x;
587 }
588 
589 //------------------------------------------------------------------------------
590 // Name: operator~
591 //------------------------------------------------------------------------------
592 KNumber KNumber::operator~() const {
593  KNumber x(*this);
594  x.value_ = x.value_->cmp();
595  return x;
596 }
597 
598 //------------------------------------------------------------------------------
599 // Name: toQString
600 //------------------------------------------------------------------------------
601 QString KNumber::toQString(int width, int precision) const {
602 
603  if(value_->is_zero()) {
604  return QLatin1String("0");
605  }
606 
607  QString s;
608 
609  if(detail::knumber_integer *const p = dynamic_cast<detail::knumber_integer *>(value_)) {
610  if(width > 0) {
611  s = detail::knumber_float(p).toString(width);
612  } else {
613  s = value_->toString(width);
614  }
615  } else if(detail::knumber_float *const p = dynamic_cast<detail::knumber_float *>(value_)) {
616  if(width > 0) {
617  s = value_->toString(width);
618  } else {
619  s = value_->toString(3 * mpf_get_default_prec() / 10);
620  }
621  } else if(detail::knumber_fraction *const p = dynamic_cast<detail::knumber_fraction *>(value_)) {
622  s = value_->toString(width);
623  } else {
624  return value_->toString(width);
625  }
626 
627  // now do some rounding to make sure things are displayed reasonably
628  if (precision >= 0) {
629  return round(s, precision);
630  } else {
631  return s;
632  }
633 }
634 
635 //------------------------------------------------------------------------------
636 // Name: toUint64
637 //------------------------------------------------------------------------------
638 quint64 KNumber::toUint64() const {
639  return value_->toUint64();
640 }
641 
642 //------------------------------------------------------------------------------
643 // Name: toInt64
644 //------------------------------------------------------------------------------
645 qint64 KNumber::toInt64() const {
646  return value_->toInt64();
647 }
648 
649 //------------------------------------------------------------------------------
650 // Name: abs
651 //------------------------------------------------------------------------------
652 KNumber KNumber::abs() const {
653  KNumber z(*this);
654  z.value_ = z.value_->abs();
655  z.simplify();
656  return z;
657 }
658 
659 //------------------------------------------------------------------------------
660 // Name: cbrt
661 //------------------------------------------------------------------------------
662 KNumber KNumber::cbrt() const {
663  KNumber z(*this);
664  z.value_ = z.value_->cbrt();
665  z.simplify();
666  return z;
667 }
668 
669 //------------------------------------------------------------------------------
670 // Name: sqrt
671 //------------------------------------------------------------------------------
672 KNumber KNumber::sqrt() const {
673  KNumber z(*this);
674  z.value_ = z.value_->sqrt();
675  z.simplify();
676  return z;
677 }
678 
679 //------------------------------------------------------------------------------
680 // Name: pow
681 //------------------------------------------------------------------------------
682 KNumber KNumber::pow(const KNumber &x) const {
683 
684  // Fix for bug #330711 (pow(0, -x) was causing crashes
685  // Fix for bug #330597 (pow(0,0) was 1 now it is NaN
686  // Thanks to Raushan Kumar for identifying the issue and submitting
687  // patches
688  if(*this == Zero && x <= Zero) {
689  return NaN;
690  }
691 
692  // if the LHS is a special then we can use this function
693  // no matter what, cause the result is a special too
694  if(!dynamic_cast<detail::knumber_error *>(value_)) {
695  // number much bigger than this tend to crash GMP with
696  // an abort
697  if(x > KNumber(QLatin1String("1000000000"))) {
698  return PosInfinity;
699  }
700  }
701 
702  KNumber z(*this);
703  z.value_ = z.value_->pow(x.value_);
704  z.simplify();
705  return z;
706 }
707 
708 //------------------------------------------------------------------------------
709 // Name: sin
710 //------------------------------------------------------------------------------
711 KNumber KNumber::sin() const {
712  KNumber z(*this);
713  z.value_ = z.value_->sin();
714  z.simplify();
715  return z;
716 }
717 
718 //------------------------------------------------------------------------------
719 // Name: cos
720 //------------------------------------------------------------------------------
721 KNumber KNumber::cos() const {
722  KNumber z(*this);
723  z.value_ = z.value_->cos();
724  z.simplify();
725  return z;
726 }
727 
728 //------------------------------------------------------------------------------
729 // Name: tan
730 //------------------------------------------------------------------------------
731 KNumber KNumber::tan() const {
732  KNumber z(*this);
733  z.value_ = z.value_->tan();
734  z.simplify();
735  return z;
736 }
737 
738 //------------------------------------------------------------------------------
739 // Name: tgamma
740 //------------------------------------------------------------------------------
741 KNumber KNumber::tgamma() const {
742  KNumber z(*this);
743  if(z > KNumber(QLatin1String("10000000000"))) {
744  return PosInfinity;
745  }
746  z.value_ = z.value_->tgamma();
747  z.simplify();
748  return z;
749 }
750 
751 //------------------------------------------------------------------------------
752 // Name: asin
753 //------------------------------------------------------------------------------
754 KNumber KNumber::asin() const {
755  KNumber z(*this);
756  z.value_ = z.value_->asin();
757  z.simplify();
758  return z;
759 }
760 
761 //------------------------------------------------------------------------------
762 // Name: acos
763 //------------------------------------------------------------------------------
764 KNumber KNumber::acos() const {
765  KNumber z(*this);
766  z.value_ = z.value_->acos();
767  z.simplify();
768  return z;
769 }
770 
771 //------------------------------------------------------------------------------
772 // Name: atan
773 //------------------------------------------------------------------------------
774 KNumber KNumber::atan() const {
775  KNumber z(*this);
776  z.value_ = z.value_->atan();
777  z.simplify();
778  return z;
779 }
780 
781 //------------------------------------------------------------------------------
782 // Name: sinh
783 //------------------------------------------------------------------------------
784 KNumber KNumber::sinh() const {
785  KNumber z(*this);
786  z.value_ = z.value_->sinh();
787  z.simplify();
788  return z;
789 }
790 
791 //------------------------------------------------------------------------------
792 // Name: cosh
793 //------------------------------------------------------------------------------
794 KNumber KNumber::cosh() const {
795  KNumber z(*this);
796  z.value_ = z.value_->cosh();
797  z.simplify();
798  return z;
799 }
800 
801 //------------------------------------------------------------------------------
802 // Name: tanh
803 //------------------------------------------------------------------------------
804 KNumber KNumber::tanh() const {
805  KNumber z(*this);
806  z.value_ = z.value_->tanh();
807  z.simplify();
808  return z;
809 }
810 
811 //------------------------------------------------------------------------------
812 // Name: asinh
813 //------------------------------------------------------------------------------
814 KNumber KNumber::asinh() const {
815  KNumber z(*this);
816  z.value_ = z.value_->asinh();
817  z.simplify();
818  return z;
819 }
820 
821 //------------------------------------------------------------------------------
822 // Name: acosh
823 //------------------------------------------------------------------------------
824 KNumber KNumber::acosh() const {
825  KNumber z(*this);
826  z.value_ = z.value_->acosh();
827  z.simplify();
828  return z;
829 }
830 
831 //------------------------------------------------------------------------------
832 // Name: atanh
833 //------------------------------------------------------------------------------
834 KNumber KNumber::atanh() const {
835  KNumber z(*this);
836  z.value_ = z.value_->atanh();
837  z.simplify();
838  return z;
839 }
840 
841 //------------------------------------------------------------------------------
842 // Name: factorial
843 //------------------------------------------------------------------------------
844 KNumber KNumber::factorial() const {
845  KNumber z(*this);
846 
847  // number much bigger than this tend to crash GMP with
848  // an abort
849  if(z > KNumber(QLatin1String("10000000000"))) {
850  return PosInfinity;
851  }
852 
853  z.value_ = z.value_->factorial();
854  z.simplify();
855  return z;
856 }
857 
858 //------------------------------------------------------------------------------
859 // Name: log2
860 //------------------------------------------------------------------------------
861 KNumber KNumber::log2() const {
862  KNumber z(*this);
863  z.value_ = z.value_->log2();
864  z.simplify();
865  return z;
866 }
867 
868 //------------------------------------------------------------------------------
869 // Name: log10
870 //------------------------------------------------------------------------------
871 KNumber KNumber::log10() const {
872  KNumber z(*this);
873  z.value_ = z.value_->log10();
874  z.simplify();
875  return z;
876 }
877 
878 //------------------------------------------------------------------------------
879 // Name: ln
880 //------------------------------------------------------------------------------
881 KNumber KNumber::ln() const {
882  KNumber z(*this);
883  z.value_ = z.value_->ln();
884  z.simplify();
885  return z;
886 }
887 
888 //------------------------------------------------------------------------------
889 // Name: floor
890 //------------------------------------------------------------------------------
891 KNumber KNumber::floor() const {
892  KNumber z(*this);
893  z.value_ = z.value_->floor();
894  z.simplify();
895  return z;
896 }
897 
898 //------------------------------------------------------------------------------
899 // Name: ceil
900 //------------------------------------------------------------------------------
901 KNumber KNumber::ceil() const {
902  KNumber z(*this);
903  z.value_ = z.value_->ceil();
904  z.simplify();
905  return z;
906 }
907 
908 //------------------------------------------------------------------------------
909 // Name: exp2
910 //------------------------------------------------------------------------------
911 KNumber KNumber::exp2() const {
912  KNumber z(*this);
913  z.value_ = z.value_->exp2();
914  z.simplify();
915  return z;
916 }
917 
918 //------------------------------------------------------------------------------
919 // Name: exp10
920 //------------------------------------------------------------------------------
921 KNumber KNumber::exp10() const {
922  KNumber z(*this);
923  z.value_ = z.value_->exp10();
924  z.simplify();
925  return z;
926 }
927 
928 //------------------------------------------------------------------------------
929 // Name: exp
930 //------------------------------------------------------------------------------
931 KNumber KNumber::exp() const {
932  KNumber z(*this);
933  z.value_ = z.value_->exp();
934  z.simplify();
935  return z;
936 }
937 
938 //------------------------------------------------------------------------------
939 // Name: bin
940 //------------------------------------------------------------------------------
941 KNumber KNumber::bin(const KNumber &x) const {
942  KNumber z(*this);
943  z.value_ = z.value_->bin(x.value_);
944  z.simplify();
945  return z;
946 }
detail::knumber_base::tanh
virtual knumber_base * tanh()=0
KNumber::exp2
KNumber exp2() const
Definition: knumber.cpp:911
detail::knumber_base::is_integer
virtual bool is_integer() const =0
QString::indexOf
int indexOf(QChar ch, int from, Qt::CaseSensitivity cs) const
detail::knumber_fraction::set_default_fractional_output
static void set_default_fractional_output(bool value)
Definition: knumber_fraction.cpp:43
QString::append
QString & append(QChar ch)
KNumber::toQString
QString toQString(int width=-1, int precision=-1) const
Definition: knumber.cpp:601
KNumber::pow
KNumber pow(const KNumber &x) const
Definition: knumber.cpp:682
QString::truncate
void truncate(int position)
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:53
KNumber::groupSeparator
static QString groupSeparator()
Definition: knumber.cpp:196
KNumber::abs
KNumber abs() const
Definition: knumber.cpp:652
KNumber::asinh
KNumber asinh() const
Definition: knumber.cpp:814
KNumber::atan
KNumber atan() const
Definition: knumber.cpp:774
KNumber::NaN
static const KNumber NaN
Definition: knumber.h:54
detail::knumber_base::toUint64
virtual quint64 toUint64() const =0
KNumber::One
static const KNumber One
Definition: knumber.h:50
KNumber::exp
KNumber exp() const
Definition: knumber.cpp:931
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:566
KNumber::setGroupSeparator
static void setGroupSeparator(const QString &ch)
Definition: knumber.cpp:182
QString::prepend
QString & prepend(QChar ch)
KNumber::setDefaultFloatOutput
static void setDefaultFloatOutput(bool x)
Definition: knumber.cpp:233
KNumber::Zero
static const KNumber Zero
Definition: knumber.h:49
KNumber::acosh
KNumber acosh() const
Definition: knumber.cpp:824
detail::knumber_base::neg
virtual knumber_base * neg()=0
KNumber::cos
KNumber cos() const
Definition: knumber.cpp:721
QRegExp::escape
QString escape(const QString &str)
KNumber::operator>>=
KNumber & operator>>=(const KNumber &rhs)
Definition: knumber.cpp:574
KNumber::operator-=
KNumber & operator-=(const KNumber &rhs)
Definition: knumber.cpp:498
detail::knumber_base::cbrt
virtual knumber_base * cbrt()=0
QString::size
int size() const
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:42
KNumber::Euler
static KNumber Euler()
Definition: knumber.cpp:255
detail::knumber_base::log10
virtual knumber_base * log10()=0
QString::remove
QString & remove(int position, int n)
KNumber::toInt64
qint64 toInt64() const
Definition: knumber.cpp:645
KNumber::integerPart
KNumber integerPart() const
Definition: knumber.cpp:434
detail::knumber_base::sub
virtual knumber_base * sub(knumber_base *rhs)=0
QList::size
int size() const
KNumber::TYPE_FRACTION
Definition: knumber.h:44
KNumber::floor
KNumber floor() const
Definition: knumber.cpp:891
KNumber::bin
KNumber bin(const KNumber &x) const
Definition: knumber.cpp:941
QString::clear
void clear()
detail::knumber_base::is_zero
virtual bool is_zero() const =0
detail::knumber_base::ceil
virtual knumber_base * ceil()=0
detail::knumber_base::cos
virtual knumber_base * cos()=0
KNumber::setDefaultFloatPrecision
static void setDefaultFloatPrecision(int precision)
Definition: knumber.cpp:210
QRegExp
KNumber::operator+=
KNumber & operator+=(const KNumber &rhs)
Definition: knumber.cpp:489
KNumber::log10
KNumber log10() const
Definition: knumber.cpp:871
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
QRegExp::capturedTexts
QStringList capturedTexts() const
detail::knumber_integer
Definition: knumber_integer.h:28
detail::knumber_base::atan
virtual knumber_base * atan()=0
KNumber::KNumber
KNumber()
Definition: knumber.cpp:270
KNumber::tgamma
KNumber tgamma() const
Definition: knumber.cpp:741
detail::knumber_float::toString
virtual QString toString(int precision) const
Definition: knumber_float.cpp:818
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:861
KNumber::operator&=
KNumber & operator&=(const KNumber &rhs)
Definition: knumber.cpp:542
knumber_fraction.h
KNumber::exp10
KNumber exp10() const
Definition: knumber.cpp:921
QString
detail::knumber_base::sqrt
virtual knumber_base * sqrt()=0
KNumber::setSplitoffIntegerForFractionOutput
static void setSplitoffIntegerForFractionOutput(bool x)
Definition: knumber.cpp:219
QStringList
detail::knumber_base::abs
virtual knumber_base * abs()=0
detail::knumber_base::toInt64
virtual qint64 toInt64() const =0
detail::knumber_base::tgamma
virtual knumber_base * tgamma()=0
KNumber
Definition: knumber.h:30
KNumber::swap
void swap(KNumber &other)
Definition: knumber.cpp:427
knumber_base.h
KNumber::sin
KNumber sin() const
Definition: knumber.cpp:711
KNumber::tan
KNumber tan() const
Definition: knumber.cpp:731
QLatin1Char
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
KNumber::ceil
KNumber ceil() const
Definition: knumber.cpp:901
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:592
detail::knumber_base::exp
virtual knumber_base * exp()=0
KNumber::toUint64
quint64 toUint64() const
Definition: knumber.cpp:638
KNumber::cosh
KNumber cosh() const
Definition: knumber.cpp:794
QString::replace
QString & replace(int position, int n, QChar after)
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:550
KNumber::PosInfinity
static const KNumber PosInfinity
Definition: knumber.h:52
KNumber::operator=
KNumber & operator=(const KNumber &rhs)
Definition: knumber.cpp:419
KNumber::cbrt
KNumber cbrt() const
Definition: knumber.cpp:662
KNumber::factorial
KNumber factorial() const
Definition: knumber.cpp:844
QString::toLatin1
QByteArray toLatin1() const
QString::mid
QString mid(int position, int n) const
KNumber::operator*=
KNumber & operator*=(const KNumber &rhs)
Definition: knumber.cpp:507
QLatin1String
detail::knumber_base::floor
virtual knumber_base * floor()=0
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
QString::length
int length() const
knumber_float.h
KNumber::asin
KNumber asin() const
Definition: knumber.cpp:754
KNumber::TYPE_FLOAT
Definition: knumber.h:43
QString::section
QString section(QChar sep, int start, int end, QFlags< QString::SectionFlag > flags) const
KNumber::ln
KNumber ln() const
Definition: knumber.cpp:881
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:764
detail::knumber_base::factorial
virtual knumber_base * factorial()=0
KNumber::atanh
KNumber atanh() const
Definition: knumber.cpp:834
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:583
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:40
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:51
QRegExp::exactMatch
bool exactMatch(const QString &str) const
KNumber::sinh
KNumber sinh() const
Definition: knumber.cpp:784
KNumber::sqrt
KNumber sqrt() const
Definition: knumber.cpp:672
KNumber::operator^=
KNumber & operator^=(const KNumber &rhs)
Definition: knumber.cpp:558
KNumber::operator%=
KNumber & operator%=(const KNumber &rhs)
Definition: knumber.cpp:533
KNumber::TYPE_ERROR
Definition: knumber.h:41
detail::knumber_base::sin
virtual knumber_base * sin()=0
knumber.h
KNumber::tanh
KNumber tanh() const
Definition: knumber.cpp:804
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