std::ios::fmtflags oldflags = c.s.flags();
c.s.setf(std::ios::scientific);
if (this->is_rational() && !this->is_integer()) {
- if (compare(_num0()) > 0) {
+ if (compare(_num0) > 0) {
c.s << "(";
if (is_a<print_csrc_cl_N>(c))
c.s << "cln::cl_F(\"" << numer().evalf() << "\")";
const numeric numeric::add(const numeric &other) const
{
// Efficiency shortcut: trap the neutral element by pointer.
- static const numeric * _num0p = &_num0();
- if (this==_num0p)
+ if (this==_num0_p)
return other;
- else if (&other==_num0p)
+ else if (&other==_num0_p)
return *this;
return numeric(cln::the<cln::cl_N>(value)+cln::the<cln::cl_N>(other.value));
const numeric numeric::mul(const numeric &other) const
{
// Efficiency shortcut: trap the neutral element by pointer.
- static const numeric * _num1p = &_num1();
- if (this==_num1p)
+ if (this==_num1_p)
return other;
- else if (&other==_num1p)
+ else if (&other==_num1_p)
return *this;
return numeric(cln::the<cln::cl_N>(value)*cln::the<cln::cl_N>(other.value));
const numeric numeric::power(const numeric &other) const
{
// Efficiency shortcut: trap the neutral exponent by pointer.
- static const numeric * _num1p = &_num1();
- if (&other==_num1p)
+ if (&other==_num1_p)
return *this;
if (cln::zerop(cln::the<cln::cl_N>(value))) {
else if (cln::minusp(cln::realpart(cln::the<cln::cl_N>(other.value))))
throw std::overflow_error("numeric::eval(): division by zero");
else
- return _num0();
+ return _num0;
}
return numeric(cln::expt(cln::the<cln::cl_N>(value),cln::the<cln::cl_N>(other.value)));
}
const numeric &numeric::add_dyn(const numeric &other) const
{
// Efficiency shortcut: trap the neutral element by pointer.
- static const numeric * _num0p = &_num0();
- if (this==_num0p)
+ if (this==_num0_p)
return other;
- else if (&other==_num0p)
+ else if (&other==_num0_p)
return *this;
return static_cast<const numeric &>((new numeric(cln::the<cln::cl_N>(value)+cln::the<cln::cl_N>(other.value)))->
const numeric &numeric::mul_dyn(const numeric &other) const
{
// Efficiency shortcut: trap the neutral element by pointer.
- static const numeric * _num1p = &_num1();
- if (this==_num1p)
+ if (this==_num1_p)
return other;
- else if (&other==_num1p)
+ else if (&other==_num1_p)
return *this;
return static_cast<const numeric &>((new numeric(cln::the<cln::cl_N>(value)*cln::the<cln::cl_N>(other.value)))->
const numeric &numeric::power_dyn(const numeric &other) const
{
// Efficiency shortcut: trap the neutral exponent by pointer.
- static const numeric * _num1p=&_num1();
- if (&other==_num1p)
+ if (&other==_num1_p)
return *this;
if (cln::zerop(cln::the<cln::cl_N>(value))) {
else if (cln::minusp(cln::realpart(cln::the<cln::cl_N>(other.value))))
throw std::overflow_error("numeric::eval(): division by zero");
else
- return _num0();
+ return _num0;
}
return static_cast<const numeric &>((new numeric(cln::expt(cln::the<cln::cl_N>(value),cln::the<cln::cl_N>(other.value))))->
setflag(status_flags::dynallocated));
const numeric numeric::denom(void) const
{
if (this->is_integer())
- return _num1();
+ return _num1;
if (cln::instanceof(value, cln::cl_RA_ring))
return numeric(cln::denominator(cln::the<cln::cl_RA>(value)));
const cln::cl_RA r = cln::the<cln::cl_RA>(cln::realpart(cln::the<cln::cl_N>(value)));
const cln::cl_RA i = cln::the<cln::cl_RA>(cln::imagpart(cln::the<cln::cl_N>(value)));
if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_I_ring))
- return _num1();
+ return _num1;
if (cln::instanceof(r, cln::cl_I_ring) && cln::instanceof(i, cln::cl_RA_ring))
return numeric(cln::denominator(i));
if (cln::instanceof(r, cln::cl_RA_ring) && cln::instanceof(i, cln::cl_I_ring))
return numeric(cln::lcm(cln::denominator(r), cln::denominator(i)));
}
// at least one float encountered
- return _num1();
+ return _num1;
}
{
if (!x.is_real() &&
x.real().is_zero() &&
- abs(x.imag()).is_equal(_num1()))
+ abs(x.imag()).is_equal(_num1))
throw pole_error("atan(): logarithmic pole",0);
return cln::atan(x.to_cl_N());
}
const numeric Li2(const numeric &x)
{
if (x.is_zero())
- return _num0();
+ return _num0;
// what is the desired float format?
// first guess: default format
* @exception range_error (argument must be integer >= -1) */
const numeric doublefactorial(const numeric &n)
{
- if (n.is_equal(_num_1()))
- return _num1();
+ if (n.is_equal(_num_1))
+ return _num1;
if (!n.is_nonneg_integer())
throw std::range_error("numeric::doublefactorial(): argument must be integer >= -1");
{
if (n.is_integer() && k.is_integer()) {
if (n.is_nonneg_integer()) {
- if (k.compare(n)!=1 && k.compare(_num0())!=-1)
+ if (k.compare(n)!=1 && k.compare(_num0)!=-1)
return numeric(cln::binomial(n.to_int(),k.to_int()));
else
- return _num0();
+ return _num0;
} else {
- return _num_1().power(k)*binomial(k-n-_num1(),k);
+ return _num_1.power(k)*binomial(k-n-_num1,k);
}
}
// we don't use it.)
// the special cases not covered by the algorithm below
- if (nn.is_equal(_num1()))
- return _num_1_2();
+ if (nn.is_equal(_num1))
+ return _num_1_2;
if (nn.is_odd())
- return _num0();
+ return _num0;
// store nonvanishing Bernoulli numbers here
static std::vector< cln::cl_RA > results;
// hence
// F(2n+2) = F(n+1)*(2*F(n) + F(n+1))
if (n.is_zero())
- return _num0();
+ return _num0;
if (n.is_negative())
if (n.is_even())
return -fibonacci(-n);
return cln::mod(cln::the<cln::cl_I>(a.to_cl_N()),
cln::the<cln::cl_I>(b.to_cl_N()));
else
- return _num0();
+ return _num0;
}
return cln::mod(cln::the<cln::cl_I>(a.to_cl_N()) + b2,
cln::the<cln::cl_I>(b.to_cl_N())) - b2;
} else
- return _num0();
+ return _num0;
}
return cln::rem(cln::the<cln::cl_I>(a.to_cl_N()),
cln::the<cln::cl_I>(b.to_cl_N()));
else
- return _num0();
+ return _num0;
}
q = rem_quo.quotient;
return rem_quo.remainder;
} else {
- q = _num0();
- return _num0();
+ q = _num0;
+ return _num0;
}
}
return cln::truncate1(cln::the<cln::cl_I>(a.to_cl_N()),
cln::the<cln::cl_I>(b.to_cl_N()));
else
- return _num0();
+ return _num0;
}
r = rem_quo.remainder;
return rem_quo.quotient;
} else {
- r = _num0();
- return _num0();
+ r = _num0;
+ return _num0;
}
}
return cln::gcd(cln::the<cln::cl_I>(a.to_cl_N()),
cln::the<cln::cl_I>(b.to_cl_N()));
else
- return _num1();
+ return _num1;
}
cln::isqrt(cln::the<cln::cl_I>(x.to_cl_N()), &root);
return root;
} else
- return _num0();
+ return _num0;
}