31#include "interval.hpp"
32#include "l_interval.hpp"
36#ifdef CXSC_USE_TLS_PREC
39__declspec(thread)
int stagprec = 2;
41__thread
int stagprec = 2;
80void l_real::_clear(
int p)
noexcept
83 for (
int i=p; i<=prec; i++)
88void l_real::_akku_out(
const dotprecision& d)
noexcept
94 this->elem(1) = rnd(dot);
99 dot -= this->elem(i-1);
100 this->elem(i) = rnd(dot);
102 weiter = this->elem(i-1) != 0;
103 }
while (weiter && (i <= prec));
107void l_real::_akku_out_up(
const dotprecision& d)
noexcept
115 this->elem(1) = (prec==1)? rnd(dot,RND_UP) : rnd(dot);
120 dot -= this->elem(i-1);
121 weiter = (sign(dot) != 0);
123 this->elem(i) = (i==prec)?
124 rnd(dot,RND_UP) : rnd(dot);
126 }
while (weiter && (i <= prec));
130void l_real::_akku_out_down(
const dotprecision& d)
noexcept
138 this->elem(1) = (prec==1)? rnd(dot,RND_DOWN) : rnd(dot);
143 dot -= this->elem(i-1);
144 weiter = (sign(dot) != 0);
146 this->elem(i) = (i==prec)?
147 rnd(dot,RND_DOWN) : rnd(dot);
149 }
while (weiter && (i <= prec));
153void l_real::_akku_add(dotprecision& d)
const noexcept
156 for (
int i=1; i<=prec; i++)
158 if (this->elem(i) != 0) d += this->elem(i);
162void l_real::_akku_sub(dotprecision& d)
const noexcept
165 for (
int i=1; i<=prec; i++)
167 if (this->elem(i) != 0) d -= this->elem(i);
176 data=
new real[stagprec];
183l_real::~l_real() noexcept
189 : data(
new real[lr.prec])
194 memcpy(data,lr.data,
sizeof(
real)*prec);
207 : prec(1), data(
new real[1])
237 memset(akku,0,BUFFERSIZE);
243 memset(akku,0,BUFFERSIZE);
283 memcpy(tmp,lr.data,
sizeof(
real)*prec);
295 data=
new real[prec=stagprec];
317std::istream& operator>>(std::istream& s,
l_real& lr)
noexcept
325std::ostream& operator<<(std::ostream& s,
const l_real& lr)
noexcept
332std::string& operator>>(std::string& s,
l_real& lr)
noexcept
340std::string& operator<<(std::string& s,
const l_real& lr)
noexcept
347void operator>>(
const std::string& s,
l_real& lr)
noexcept
352void operator>>(
const char *s,
l_real& lr)
noexcept
362 for (
int i=1; i<=lr.prec; i++)
363 accumulate(d, lr.elem(i), r);
369 for (
int i=1; i<=lr.prec; i++)
370 accumulate(d, lr.elem(i), r);
377 for (i=1; i<=lr1.prec; i++)
378 for (j=1; j<=lr2.prec; j++)
380 accumulate(d, lr1.elem(i), lr2.elem(j));
397 lr._akku_out_down(a);
429{ lr = lr-_l_real(r);
return lr; }
432{ lr = lr+_l_real(r);
return lr; }
435{ lr = lr*_l_real(r);
return lr; }
438{ lr = lr/_l_real(r);
return lr; }
440real& operator-=(
real& r,
const l_real& lr)
noexcept { r = r-_real(lr);
return r; }
445bool operator==(
const l_real& lr,
const real& r)
noexcept {
return lr==_l_real(r); }
446bool operator==(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)==lr; }
447bool operator!=(
const l_real& lr,
const real& r)
noexcept {
return lr!=_l_real(r); }
448bool operator!=(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)!=lr; }
450bool operator<=(
const l_real& lr,
const real& r)
noexcept {
return lr<=_l_real(r); }
451bool operator<=(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)<=lr; }
452bool operator>=(
const l_real& lr,
const real& r)
noexcept {
return lr>=_l_real(r); }
453bool operator>=(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)>=lr; }
455bool operator<(
const l_real& lr,
const real& r)
noexcept {
return lr<_l_real(r); }
456bool operator<(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)<lr; }
457bool operator>(
const l_real& lr,
const real& r)
noexcept {
return lr>_l_real(r); }
458bool operator>(
const real& r,
const l_real& lr)
noexcept {
return _l_real(r)>lr; }
478 for (
int i=1; i<=lr1.prec; i++)
479 lr2.elem(i) = -(lr1.elem(i));
512 accumulate(dot, lr1, lr2);
526 a = rnd(dot1, RND_DOWN);
527 b = rnd(dot2, RND_UP);
530 cxscthrow(DIV_BY_ZERO(
"l_real operator/(const l_real&, const l_real&)"));
534 for (
int i=2; i<=stagprec; i++)
538 for (
int j=1; j<=lr2.prec; j++)
539 if (!!lr3.elem(i-1) && !!lr2.elem(j) )
540 accumulate(dot1, lr3.elem(i-1), -lr2.elem(j));
541 a = rnd(dot1, RND_DOWN);
579bool operator!=(
const l_real& lr1,
const l_real& lr2)
noexcept {
return !(lr1==lr2); }
580bool operator< (
const l_real& lr1,
const l_real& lr2)
noexcept {
return !(lr2<=lr1); }
581bool operator> (
const l_real& lr1,
const l_real& lr2)
noexcept {
return !(lr1<=lr2); }
582bool operator>=(
const l_real& lr1,
const l_real& lr2)
noexcept {
return (lr2<=lr1); }
633bool operator ==(
const interval &i,
const l_real &r)
noexcept {
return Inf(i)==r && Sup(i)==r; }
634bool operator !=(
const interval &i,
const l_real &r)
noexcept {
return Inf(i)!=r || Sup(i)!=r; }
636bool operator >(
const interval &i,
const l_real &r)
noexcept {
return Inf(i)<r && Sup(i)>r; }
637bool operator <=(
const interval &i,
const l_real &r)
noexcept {
return Inf(i)==r && Sup(i)==r; }
638bool operator >=(
const interval &i,
const l_real &r)
noexcept {
return Inf(i)<=r && Sup(i)>=r; }
640bool operator ==(
const l_real &r,
const interval &i)
noexcept {
return Inf(i)==r && Sup(i)==r; }
641bool operator !=(
const l_real &r,
const interval &i)
noexcept {
return Inf(i)!=r || Sup(i)!=r; }
642bool operator <(
const l_real &r,
const interval &i)
noexcept {
return Inf(i)<r && Sup(i)>r; }
644bool operator <=(
const l_real &r,
const interval &i)
noexcept {
return Inf(i)<=r && Sup(i)>=r; }
645bool operator >=(
const l_real &r,
const interval &i)
noexcept {
return Inf(i)==r && Sup(i)==r; }
661real & real::operator = (
const l_real& a)
noexcept
695 if (x.prec == stagprec)
697 else if (x.prec > stagprec)
705 for (i = 0; i <= stagprec-x.prec-1; i++)
707 for (i = stagprec-x.prec; i <= stagprec-1; i++)
708 y.data[i] = x.data[i-(stagprec-x.prec)];
731 while (y.elem(k)==0 && k>1) k--;
732 return expo(y.elem(k));
750 while (y.elem(k)==0 && k<p) k++;
751 return expo(y.elem(k));
The Data Type dotprecision.
dotprecision(void) noexcept
Constructor of class dotprecision.
dotprecision & operator=(const dotprecision &) noexcept
Implementation of standard assigning operator.
The Data Type idotprecision.
idotprecision()
Constructor of class idotprecision.
The Scalar Type interval.
interval & operator=(const real &a)
Implementation of standard assigning operator.
interval()
Constructor of class interval.
The Multiple-Precision Data Type l_interval.
The Multiple-Precision Data Type l_real.
real & operator[](int) const noexcept
Access to the single components used to store the long data type value.
l_real(void) noexcept
Constructor of class l_real.
real(void) noexcept
Constructor of class real.
The namespace cxsc, providing all functionality of the class library C-XSC.
cdotprecision & operator+=(cdotprecision &cd, const l_complex &lc) noexcept
Implementation of standard algebraic addition and allocation operation.
l_real rnd_up(const dotprecision &a)
Rounds the argument up to the next l_real value.
civector operator/(const cimatrix_subv &rv, const cinterval &s) noexcept
Implementation of division operation.
int expo_gr(const l_interval &x)
l_real rnd_down(const dotprecision &a)
Rounds the argument down to the next l_real value.
cimatrix & operator*=(cimatrix &m, const cinterval &c) noexcept
Implementation of multiplication and allocation operation.
ivector abs(const cimatrix_subv &mv) noexcept
Returns the absolute value of the matrix.
civector operator*(const cimatrix_subv &rv, const cinterval &s) noexcept
Implementation of multiplication operation.
int expo_sm(const l_interval &x)
dotprecision _dotprecision(const real &d) noexcept
cimatrix & operator/=(cimatrix &m, const cinterval &c) noexcept
Implementation of division and allocation operation.