46interval<C>::interval(
typename util::CallTraits<baseType>::TParam iValue)
53interval<C>::interval(
typename util::CallTraits<baseType>::TParam iInf,
typename util::CallTraits<baseType>::TParam iSup)
60interval<C>& interval<C>::operator=(
const interval<C>& i)
68const interval<C>& interval<C>::operator+()
const
74void interval<C>::set(
typename util::CallTraits<C>::TParam iInf,
typename util::CallTraits<C>::TParam iSup)
81bool interval<C>::isEmpty()
const
88bool interval<C>::isSingleton()
const
95bool interval<C>::contains(
typename util::CallTraits<baseType>::TParam ix)
const
97 return (ix>=v[0]) && (ix<=v[1]);
101C& interval<C>::operator[](
int i)
107C interval<C>::operator[](
int i)
const
113C interval<C>::inf()
const
119C interval<C>::sup()
const
137C interval<C>::mid()
const
139 return static_cast<C
>(0.5)*(v[0]+v[1]);
143C interval<C>::diam()
const
149C interval<C>::ratio()
const
151 if (v[0]!=
static_cast<C
>(0.0))
158bool interval<C>::operator> (
const interval<C>& i)
const
164bool interval<C>::operator< (
const interval<C>& i)
const
170bool interval<C>::operator==(
const interval<C>& i)
const
172 return (v[0]==i.v[0]) && (v[1]==i.v[1]);
176bool interval<C>::operator!=(
const interval<C>& i)
const
182bool interval<C>::operator>=(
const interval<C>& i)
const
184 return (v[0]>=i.v[0]) && (v[1]>=i.v[1]);
188bool interval<C>::operator<=(
const interval<C>& i)
const
190 return (v[0]<=i.v[0]) && (v[1]<=i.v[1]);
194bool interval<C>::pe(
const interval<C>& i)
const
196 return ((v[0]<i.v[0]) && (v[1]>i.v[0])) || ((v[0]<i.v[1])&&(v[1]>i.v[1]));
200bool interval<C>::pne(
const interval<C>& i)
const
206bool interval<C>::pg(
const interval<C>& i)
const
212bool interval<C>::pge(
const interval<C>& i)
const
218bool interval<C>::pl(
const interval<C>& i)
const
224bool interval<C>::ple(
const interval<C>& i)
const
230std::ostream& operator<<( std::ostream& os,
const interval<C>& iV )
232 os <<
"<" << iV.inf() <<
"," << iV.sup() <<
">";
236template<
typename C> std::string str(
const interval<C>& iV )
238 return "<"+ str(iV.inf()) +
"," + str(iV.sup()) +
">";
245template<
typename C> C numMin4(
const C& k1,
const C& k2,
const C& k3,
const C& k4)
259template<
typename C> C numMax4(
const C& k1,
const C& k2,
const C& k3,
const C& k4)
273template<
typename C>
inline void numMinMax(
const C& k1,
const C& k2,C& amin,C& amax)
287template<
typename C>
inline void numMin(
const C& k1,
const C& k2,C& amin)
295template<
typename C>
inline void numMax(
const C& k1,
const C& k2,C& amax)
305template<
typename C> interval<C> operator+(
const interval<C>& i1,
const interval<C>& i2);
306template<
typename C> interval<C> operator-(
const interval<C>& i1,
const interval<C>& i2);
307template<
typename C> interval<C> operator*(
const interval<C>& i1,
const interval<C>& i2);
308template<
typename C> interval<C> operator/(
const interval<C>& i1,
const interval<C>& i2);
311interval<C> interval<C>::operator-()
const
313 return interval<C>(-v[1],-v[0]);
317interval<C>& interval<C>::operator+=(
const interval<C>& i)
325interval<C>& interval<C>::operator-=(
const interval<C>& i)
333interval<C>& interval<C>::operator*=(
const interval<C>& i)
336 impl::numMinMax(v[0]*i.v[0],v[0]*i.v[1],m1,M1);
337 impl::numMinMax(v[1]*i.v[0],v[1]*i.v[1],m2,M2);
338 impl::numMin(m1,m2,v[0]);
339 impl::numMax(M1,M2,v[1]);
345interval<C>& interval<C>::operator/=(
const interval<C>& i)
347 if ((i.v[0]<=0.0) && (i.v[1]>0.0))
348 LASS_THROW(
"division by zero");
350 m1 = NumTraits<C>::one / i.v[0];
351 m2 = NumTraits<C>::one / i.v[1];
353 impl::numMinMax(v[0]*m1,v[0]*m1,m1,M1);
354 impl::numMinMax(v[1]*m2,v[1]*m2,m2,M2);
355 impl::numMin(m1,m2,v[0]);
356 impl::numMax(M1,M2,v[1]);
362interval<C>& interval<C>::operator+=(
typename util::CallTraits<baseType>::TParam s)
370interval<C>& interval<C>::operator-=(
typename util::CallTraits<baseType>::TParam s)
378interval<C>& interval<C>::operator*=(
typename util::CallTraits<baseType>::TParam s)
384 std::swap(v[0],v[1]);
390interval<C>& interval<C>::operator/=(
typename util::CallTraits<baseType>::TParam s)
392 C t =
static_cast<C
>(1.0)/s;
397 std::swap(v[0],v[1]);
402template<
typename C>
inline
403interval<C> operator+(
const interval<C>& i1,
const interval<C>& i2)
410template<
typename C>
inline
411interval<C> operator-(
const interval<C>& i1,
const interval<C>& i2)
418template<
typename C>
inline
419interval<C> operator*(
const interval<C>& i1,
const interval<C>& i2)
426template<
typename C>
inline
427interval<C> operator/(
const interval<C>& i1,
const interval<C>& i2)
436C interval<C>::fe(
const interval<C>& i)
const
442 return static_cast<C
>(1.0);
443 return static_cast<C
>(0.0);
447 return (v[1]-i.v[0])/(i.v[1]-v[0]);
449 return (i.v[1]-v[0])/(v[1]-i.v[0]);
454C interval<C>::fne(
const interval<C>& i)
const
456 return static_cast<C
>(1.0)-fe(i);
461C interval<C>::fg(
const interval<C>& i)
const
465 return (i.v[0]-v[0])/(i.v[1]-v[0]);
467 return (v[0]-i.v[0])/(v[1]-i.v[0]);
472C interval<C>::fge(
const interval<C>& i)
const
474 return std::max(fg(i),fe(i));
479C interval<C>::fl(
const interval<C>& i)
const
481 return static_cast<C
>(1.0)-fg(i);
486C interval<C>::fle(
const interval<C>& i)
const
488 return std::max(fl(i),fe(i));
492void inpsqr(interval<C>& i)
498 impl::numMinMax(m1,M1,i.v[0],i.v[1]);
499 if ((i.v[0] < 0.0) && (i.v[1]>=0.0))
504void inpsqrt(interval<C>& i)
506 i.v[0] = lass::num::sqrt(i.v[0]);
507 i.v[1] = lass::num::sqrt(i.v[1]);
511void inpexp(interval<C>& i)
513 i.v[0] = lass::num::exp(i.v[0]);
514 i.v[1] = lass::num::exp(i.v[1]);
518void inplog(interval<C>& i)
520 i[0] = lass::num::log(i[0]);
521 i[1] = lass::num::log(i[1]);
525void inpnorm(interval<C>& i)
532void inpinv(interval<C>& i)
540interval<C>
sqr(
const interval<C>& i)
545 impl::numMinMax(m1,M1,m2,M2);
550 return num::interval<C>(m2,M2);
554interval<C> sqrt(
const interval<C>& i)
556 return interval<C>(lass::num::sqrt(i.inf()),lass::num::sqrt(i.sup()));
560interval<C> exp(
const interval<C>& i)
562 return interval<C>(lass::num::exp(i.inf()),lass::num::exp(i.sup()));
566interval<C> log(
const interval<C>& i)
568 return interval<C>(lass::num::log(i.inf()),lass::num::log(i.sup()));
572interval<C> set_union(
const interval<C>& i1,
const interval<C>& i2)
574 return interval<C>( std::min(i1.inf(), i2.inf()), std::max( i1.sup(), i2.sup() ) );
578interval<C> set_intersect(
const interval<C>& i1,
const interval<C>& i2)
580 return interval<C>( std::max(i1.inf(), i2.inf()), std::min( i1.sup(), i2.sup() ) );
584template<
typename C,
typename f>
585interval<C> applyFunction(
const interval<C>& iV, f func )
590 impl::numMinMax(t1,t2,r1,r2);
591 return interval<C>(r1,r2);
T inv(const T &x)
return x ^ -1
T norm(const T &x)
return norm of x as if x is real part of complex number: sqr(x)
T sqr(const T &x)
return x * x