X-Git-Url: https://ginac.de/ginac.git//ginac.git?a=blobdiff_plain;f=ginac%2Fnumeric.cpp;h=a54cca38ed3d47afa22274ac4d70646a944d4ccd;hb=f532e05bf7638c592ee609943c349739500480bf;hp=32615b0b3f8734f478f1ab042fd13e7d9b428ed6;hpb=0052e44b34c982b13b08454fd6c9429fe7a90f71;p=ginac.git diff --git a/ginac/numeric.cpp b/ginac/numeric.cpp index 32615b0b..a54cca38 100644 --- a/ginac/numeric.cpp +++ b/ginac/numeric.cpp @@ -7,7 +7,7 @@ * of special functions or implement the interface to the bignum package. */ /* - * GiNaC Copyright (C) 1999-2016 Johannes Gutenberg University Mainz, Germany + * GiNaC Copyright (C) 1999-2018 Johannes Gutenberg University Mainz, Germany * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -32,7 +32,6 @@ #include "ex.h" #include "operators.h" #include "archive.h" -#include "tostring.h" #include "utils.h" #include @@ -90,7 +89,7 @@ numeric::numeric() numeric::numeric(int i) { // Not the whole int-range is available if we don't cast to long - // first. This is due to the behaviour of the cl_I-ctor, which + // first. This is due to the behavior of the cl_I-ctor, which // emphasizes efficiency. However, if the integer is small enough // we save space and dereferences by using an immediate type. // (C.f. ) @@ -111,7 +110,7 @@ numeric::numeric(int i) numeric::numeric(unsigned int i) { // Not the whole uint-range is available if we don't cast to ulong - // first. This is due to the behaviour of the cl_I-ctor, which + // first. This is due to the behavior of the cl_I-ctor, which // emphasizes efficiency. However, if the integer is small enough // we save space and dereferences by using an immediate type. // (C.f. ) @@ -225,7 +224,7 @@ numeric::numeric(const char *s) // E to lower case term = term.replace(term.find("E"),1,"e"); // append _ to term - term += "_" + ToString((unsigned)Digits); + term += "_" + std::to_string((unsigned)Digits); // construct float using cln::cl_F(const char *) ctor. if (imaginary) ctorval = ctorval + cln::complex(cln::cl_I(0),cln::cl_F(term.c_str())); @@ -443,7 +442,7 @@ static void print_real_csrc(const print_context & c, const cln::cl_R & x) // Rational number const cln::cl_I numer = cln::numerator(cln::the(x)); const cln::cl_I denom = cln::denominator(cln::the(x)); - if (cln::plusp(x) > 0) { + if (cln::plusp(x)) { c.s << "("; print_integer_csrc(c, numer); } else { @@ -715,8 +714,6 @@ bool numeric::info(unsigned inf) const return is_odd(); case info_flags::prime: return is_prime(); - case info_flags::algebraic: - return !is_real(); } return false; } @@ -776,10 +773,8 @@ bool numeric::has(const ex &other, unsigned options) const /** Evaluation of numbers doesn't do anything at all. */ -ex numeric::eval(int level) const +ex numeric::eval() const { - // Warning: if this is ever gonna do something, the ex ctors from all kinds - // of numbers should be checking for status_flags::evaluated. return this->hold(); } @@ -789,11 +784,9 @@ ex numeric::eval(int level) const * currently set. In case the object already was a floating point number the * precision is trimmed to match the currently set default. * - * @param level ignored, only needed for overriding basic::evalf. * @return an ex-handle to a numeric. */ -ex numeric::evalf(int level) const +ex numeric::evalf() const { - // level can safely be discarded for numeric objects. return numeric(cln::cl_float(1.0, cln::default_float_format) * value); } @@ -930,9 +923,8 @@ const numeric &numeric::add_dyn(const numeric &other) const return other; else if (&other==_num0_p) return *this; - - return static_cast((new numeric(value + other.value))-> - setflag(status_flags::dynallocated)); + + return dynallocate(value + other.value); } @@ -946,9 +938,8 @@ const numeric &numeric::sub_dyn(const numeric &other) const // hack is supposed to keep the number of distinct numeric objects low. if (&other==_num0_p || cln::zerop(other.value)) return *this; - - return static_cast((new numeric(value - other.value))-> - setflag(status_flags::dynallocated)); + + return dynallocate(value - other.value); } @@ -965,8 +956,7 @@ const numeric &numeric::mul_dyn(const numeric &other) const else if (&other==_num1_p) return *this; - return static_cast((new numeric(value * other.value))-> - setflag(status_flags::dynallocated)); + return dynallocate(value * other.value); } @@ -984,8 +974,8 @@ const numeric &numeric::div_dyn(const numeric &other) const return *this; if (cln::zerop(cln::the(other.value))) throw std::overflow_error("division by zero"); - return static_cast((new numeric(value / other.value))-> - setflag(status_flags::dynallocated)); + + return dynallocate(value / other.value); } @@ -1011,8 +1001,8 @@ const numeric &numeric::power_dyn(const numeric &other) const else return *_num0_p; } - return static_cast((new numeric(cln::expt(value, other.value)))-> - setflag(status_flags::dynallocated)); + + return dynallocate(cln::expt(value, other.value)); } @@ -1749,7 +1739,7 @@ class lanczos_coeffs std::vector *current_vector; }; -std::vector* lanczos_coeffs::coeffs = 0; +std::vector* lanczos_coeffs::coeffs = nullptr; bool lanczos_coeffs::sufficiently_accurate(int digits) { if (digits<=20) { @@ -2024,7 +2014,7 @@ lanczos_coeffs::lanczos_coeffs() coeffs[3].swap(coeffs_120); } -static const cln::float_format_t guess_precision(const cln::cl_N& x) +static cln::float_format_t guess_precision(const cln::cl_N& x) { cln::float_format_t prec = cln::default_float_format; if (!instanceof(realpart(x), cln::cl_RA_ring)) @@ -2227,7 +2217,7 @@ const numeric bernoulli(const numeric &nn) results.reserve(n/2); for (unsigned p=next_r; p<=n; p+=2) { - cln::cl_I c = 1; // seed for binonmial coefficients + cln::cl_I c = 1; // seed for binomial coefficients cln::cl_RA b = cln::cl_RA(p-1)/-2; // The CLN manual says: "The conversion from `unsigned int' works only // if the argument is < 2^29" (This is for 32 Bit machines. More @@ -2539,9 +2529,8 @@ _numeric_digits& _numeric_digits::operator=(long prec) cln::default_float_format = cln::float_format(prec); // call registered callbacks - std::vector::const_iterator it = callbacklist.begin(), end = callbacklist.end(); - for (; it != end; ++it) { - (*it)(digitsdiff); + for (auto it : callbacklist) { + (it)(digitsdiff); } return *this;