Developer documentation

Interval_fcts.hpp
Go to the documentation of this file.
1 #ifndef realroot_ARITHM_INTERVAL_C
2 #define realroot_ARITHM_INTERVAL_C
3 
4 #include <string.h>
5 #include <string>
6 #include <realroot/texp_sup.hpp>
7 namespace mmx {
8 
9 #ifndef MMX_SIGN_FCT
10 #define MMX_SIGN_FCT
11  template<typename T> inline
12  int sign(const T& x) {return ( x < T(0) ? -1 : (T(0) < x ? 1 : 0) ); }
13 #endif
14 
15 template<class C, int r> inline bool
16 with_plus_sign(const Interval<C,r> & I) { return true;}
17 
18 namespace numerics
19 {
20  template<class T, int r>
21  struct interval_base
22  {
23  struct rnd{};
24  inline static T dwmul( const T& a, const T& b ) { return a*b; };
25  inline static T upmul( const T& a, const T& b ) { return a*b; };
26  inline static T dwdiv( const T& a, const T& b ) { return a/b; };
27  inline static T updiv( const T& a, const T& b ) { return a/b; };
28  inline static T dwadd( const T& a, const T& b ) { return a+b; };
29  inline static T upadd( const T& a, const T& b ) { return a+b; };
30  inline static T dwsub( const T& a, const T& b ) { return a-b; };
31  inline static T upsub( const T& a, const T& b ) { return a-b; };
32  };
33 
34  template<class T>
35  struct interval_base<T,2> : interval_base<T,0>
36  {
37  struct rnd{};
38  inline static T dwmul( const T& a, const T& b ) { return rup::dwmul(a,b); };
39  inline static T dwdiv( const T& a, const T& b ) { return rup::dwdiv(a,b); };
40  inline static T dwadd( const T& a, const T& b ) { return rup::dwadd(a,b); };
41  inline static T dwsub( const T& a, const T& b ) { return rup::dwsub(a,b); };
42  };
43 
44  template<class T>
45  struct interval_base<T,1> : interval_base<T,0>
46  {
47  struct rnd{};
48  inline static T upmul( const T& a, const T& b ) { return rdw::upmul(a,b); };
49  inline static T updiv( const T& a, const T& b ) { return rdw::updiv(a,b); };
50  inline static T upadd( const T& a, const T& b ) { return rdw::upadd(a,b); };
51  inline static T upsub( const T& a, const T& b ) { return rdw::upsub(a,b); };
52  };
53 
54  template<class T>
55  struct interval_base<T,3> : interval_base<T,1>
56  {
57  struct rnd : numerics::rounding<T>
58  {
59  rnd() : numerics::rounding<T>( numerics::rounding<T>::rnd_dw() ) {};
60  };
61  };
62 };
63 
64 template<class T, int r> struct Interval;
65 namespace let
66 {
67  template<class T, int r>
68  void assign( Interval<T,r>& i, const char * s );
69 };
70 
71 template<class C, int r> inline
72 Interval<C,r>::Interval() : m(0), M(0) {};
73 template<class C, int r> inline
74 Interval<C,r>::Interval( int n ) :m(n), M(n) {};
75 template<class C, int r> inline
76 Interval<C,r>::Interval( unsigned n ) :m(n), M(n) {};
77 template<class C, int r> inline
78 Interval<C,r>::Interval( const C& x ): m(x), M(x) {};
79 template<class C, int r> inline
80 Interval<C,r>::Interval( const C& a, const C& b ) {
81  if ( a > b ) m = b, M = a;
82  else m = a, M = b;
83 };
84 template<class C, int r> inline
85 Interval<C,r>::Interval( const char * s ) { let::assign(*this,s); };
86 template<class T, int r> inline
87 T lower ( const Interval<T,r>& x ) { return x.lower(); };
88 template<class T, int r> inline
89 T upper ( const Interval<T,r>& x ) { return x.upper(); };
90 template<class T, int r> inline
91 T median( const Interval<T,r>& x ) { return (lower(x)+upper(x))/T(2); };
92 template<class T, int r> inline
93 T width( const Interval<T,r>& x ) { return x.width(); };
94 template<class T, int r> inline
95 bool singleton( const Interval<T,r>& x ) { return x.lower() == x.upper(); };
96 template<class T, int r> inline
97 bool contain_zero( const Interval<T,r>& x )
98 { return x.lower() <= static_cast<T>(0) && x.upper() >= static_cast<T>(0); };
99 template<class T, int r> inline
100 bool in( const T& x, const Interval<T,r>& y )
101 { return y.lower() <= x && x <= y.upper(); };
102 template<class T, int r> inline
103 std::pair< Interval<T,r>, Interval<T,r> >
105 {
106  typedef Interval<T,r> I;
107  const T m(median(x));
108  return std::pair<I,I>(I(x.lower(), m), I(m, x.upper()));
109 }
110 
111 template<class T, int r> inline void
113 {
114  const T m(median(x));
115  g.define( x.lower(), m );
116  d.define( m, x.upper() );
117 };
118 
119 template<class T, int r> inline void
120 hull( Interval<T,r>& v, const Interval<T,r>& a, const Interval<T,r>& b ) {
121  v.define( std::min( a.lower(), b.lower() ), std::max( a.upper(), b.upper() ) );
122 };
123 
124 template<class T, int r> inline Interval<T,r>
125 hull( const Interval<T,r>& a, const Interval<T,r>& b ) {
126  return Interval<T,r>( std::min(a.lower(),b.lower()), std::max(a.upper(),b.upper()) );
127 };
128 
129 template<class T, int r> inline Interval<T,r>
130 min( const Interval<T,r>& a, const Interval<T,r>& b ) {
131  return Interval<T,r>( std::min(a.lower(),b.lower()), std::min(a.upper(),b.upper()) );
132 };
133 
134 template<class T, int r> inline Interval<T,r>
135 max( const Interval<T,r>& a, const Interval<T,r>& b ) {
136  return Interval<T,r>( std::max(a.lower(),b.lower()), std::max(a.upper(),b.upper()) );
137 };
138 
139 template<class T, int r> inline bool
141  return lower(a) <= upper(b) && lower(b) <= upper(a);
142 };
143 
144 template<class T, int r > inline Interval<T,r>
146  return Interval<T,r>(std::max(lower(a),lower(b)),std::min(upper(a),upper(b)));
147 };
148 
149 template<class T, int r> inline bool
151  const Interval<T,r>& a, const Interval<T,r>& b ) {
152  if ( intersectp( a, b ) )
153  {
154  result.define(std::max(lower(a),lower(b)),std::min(upper(a),upper(b)));
155  return true;
156  };
157  return false;
158 };
159 
160 /*
161 template<typename T,class X> inline
162 void distance( T& dmin, T& dmax, const X& x, const Interval<T,r>& i )
163 {
164  if ( x < i.min() ) { dmin = i.min()-x; dmax = i.max()-x; return; };
165  if ( x > i.max() ) { dmin = x-i.max(); dmax = x-i.min(); return; };
166  dmin = x-i.min();
167  dmax = i.max()-x;
168  if ( dmax < dmin ) dmax = dmin;
169  dmin = 0;
170 };
171 */
172 
173 template<class T, int r>
174 
175 T size( const Interval<T,r>& i ) { return i.size(); };
176 
177 template<class T, int r>
178 std::ostream& operator<<( std::ostream& o, const Interval<T,r>& i )
179 {
180  o << "[" << (i.lower()) << ", " << (i.upper()) << "]";
181  return o;
182 };
183 
184 template<class C, int r >
185 void abs( Interval<C,r>& x, const Interval<C,r>& a )
186 {
187  if ( a.upper() > -a.lower() )
188  {
189  x.upper() = a.upper();
190  x.lower() = std::max(-a.lower(),0);
191  }
192  else
193  {
194  x.upper() = -a.lower();
195  x.lower() = a.upper();
196  };
197 };
198 
199 template<class C, int r> inline void
201 {
202  C sv(a.M);
203  a.M = -a.m;
204  a.m = -sv;
205 };
206 
207 template<class C, int r> inline void
209 {
210  a.M = -b.m;
211  a.m = -b.M;
212 };
213 
214 template<class C, int r> inline void
215 add( Interval<C,r>& a, const C& x )
216 {
217  a.m = a.dwadd(a.m,x);
218  a.M = a.upadd(a.M,x);
219 };
220 
221 
222 template<class C, int r> inline void
223 add( Interval<C,r>& a, const Interval<C,r>& b, const C& x ) {
224  a.m = a.dwadd(b.m,x); a.M = a.upadd(b.M,x); };
225 
226 template<class C, int r> inline void
227 add( Interval<C,r>& a , const C& x , const Interval<C,r>& b ) {
228  add(a,b,x); };
229 
230 template<class C, int r> inline void
231 sub( Interval<C,r>& a, const C& x ) {
232  a.m = a.dwsub(a.m,x); a.M = a.upsub(a.M,x); };
233 
234 template<class C, int r> inline void
235 sub( Interval<C,r>& a, const Interval<C,r>& b, const C& x ) {
236  a.m = a.dwsub(b.m,x); a.M = a.upsub(b.M,x); };
237 
238 template<class C, int r> inline void
239 sub( Interval<C,r>& a, const C& x , const Interval<C,r>& b ) {
240  a.m = a.dwsub(x,b.M); a.M = a.upsub(x,b.m); };
241 
242 template<class C, int r> inline void
243 add( Interval<C,r>& a, const Interval<C,r>& x ) {
244  a.m = a.dwadd(a.m,x.m); a.M = a.upadd(a.M,x.M); };
245 
246 template<class C, int r> inline void
247 add( Interval<C,r>& a, const Interval<C,r>& b, const Interval<C,r>& x ) {
248  a.m = a.dwadd(b.m,x.m); a.M = a.upadd(b.M,x.M); };
249 
250 template<class C, int r> inline void
251 sub( Interval<C,r>& a, const Interval<C,r>& x ) {
252 a.m = a.dwsub(a.m,x.M); a.M = a.upsub(a.M,x.m); };
253 
254 template<class C, int r> inline void
255 sub( Interval<C,r>& a, const Interval<C,r>& b, const Interval<C,r>& x ) {
256  a.m = a.dwsub(b.m,x.M); a.M = a.upsub(b.M,x.m); };
257 
258 template<class C, int r> inline void
259 mul( Interval<C,r>& a, const C& x ) {
260  if ( x > 0 )
261  {
262  a.m = a.dwmul(a.m,x);
263  a.M = a.upmul(a.M,x); }
264  else
265  {
266  C sv(a.m);
267  a.m = a.dwmul(a.M,x);
268  a.M = a.dwmul(sv,x);
269  };
270 };
271 
272 
273 template<class C, int r> inline void
274 mul( Interval<C,r>& a, const Interval<C,r>& b, const C& x ) {
275  if ( &a == &b ) { mul(a,x); return; };
276  if ( x > 0 )
277  {
278  a.m = a.dwmul(b.m,x);
279  a.M = a.upmul(b.M,x);
280  }
281  else
282  {
283  a.m = a.dwmul(b.M,x);
284  a.M = a.dwmul(b.m,x);
285  };
286 };
287 
288 template<class C, int r> inline void
289 mul( Interval<C,r>& a, const C& x, const Interval<C,r>& b ) {
290  mul(a,b,x); };
291 
292 
293 template<class C, int r> inline void
295  if ( a.m > 0 )
296  {
297  if ( b.m > 0 )
298  {
299  a.m = a.dwmul(a.m,b.m);
300  a.M = a.upmul(a.M,b.M);
301  return;
302  };
303  if ( b.M < 0 )
304  {
305  C sv(a.m);
306  a.m = a.dwmul(a.M,b.m);
307  a.M = a.upmul(sv,b.M);
308  return;
309  };
310  a.m = a.dwmul(a.M,b.m);
311  a.M = a.upmul(a.M,b.M);
312  return;
313  };
314 
315  if ( a.M < 0 )
316  {
317  if ( b.m > 0 )
318  {
319  a.m = a.dwmul(b.M,a.m);
320  a.M = a.upmul(b.m,a.M);
321  return;
322  };
323  if ( b.M < 0 )
324  {
325  C sv(a.m);
326  a.m = a.dwmul(a.M,b.M);
327  a.M = a.upmul(sv,b.m);
328  return;
329  };
330  C sv(a.m);
331  a.m = a.dwmul(a.m,b.M);
332  a.M = a.upmul(sv,b.m);
333  return;
334  };
335 
336  if ( b.m > 0 )
337  {
338  a.m = a.dwmul(a.m,b.M);
339  a.M = a.upmul(a.M,b.M);
340  return;
341  }
342  if ( b.M < 0 )
343  {
344  C sv(a.m);
345  a.m = a.dwmul(a.M,b.m);
346  a.M = a.upmul(sv,b.m);
347  return;
348  };
349  // std::cout << "last case X\n";
350  C m0(a.dwmul(a.M,b.m));
351  C m1(a.dwmul(a.m,b.M));
352  if ( m0 > m1 ) m0 = m1;
353  C M0(a.upmul(a.M,b.M));
354  C M1(a.upmul(a.m,b.m));
355  if ( M0 < M1 ) M0 = M1;
356  a.m = m0;
357  a.M = M0;
358 
359 };
360 
361 template<class C, int r> inline void
362 mul( Interval<C,r>& x, const Interval<C,r>& a, const Interval<C,r>& b ) {
363  if ( &x == &a ) { mul(x,b); return; };
364  if ( &x == &b ) { mul(x,a); return; };
365 
366  if ( a.m > 0 )
367  {
368  if ( b.m > 0 )
369  {
370  x.m = a.dwmul(a.m,b.m);
371  x.M = a.upmul(a.M,b.M);
372  return;
373  };
374  if ( b.M < 0 )
375  {
376  x.m = a.dwmul(a.M,b.m);
377  x.M = a.upmul(a.m,b.M);
378  return;
379  };
380  x.m = a.dwmul(a.M,b.m);
381  x.M = a.upmul(a.M,b.M);
382  return;
383  };
384  //std::cout << "popo\n";
385  if ( a.M < 0 )
386  {
387  if ( b.m > 0 )
388  {
389  x.m = a.dwmul(b.M,a.m);
390  x.M = a.upmul(b.m,a.M);
391  return;
392  };
393  if ( b.M < 0 )
394  {
395  x.m = a.dwmul(a.M,b.M);
396  x.M = a.upmul(a.m,b.m);
397  return;
398  };
399  x.m = a.dwmul(a.m,b.M);
400  x.M = a.upmul(a.m,b.m);
401  return;
402  };
403 
404  if ( b.m > 0 )
405  {
406  x.m = a.dwmul(a.m,b.M);
407  x.M = a.upmul(a.M,b.M);
408  return;
409  }
410  if ( b.M < 0 )
411  {
412  x.m = a.dwmul(a.M,b.m);
413  x.M = a.upmul(a.m,b.m);
414  return;
415  };
416 
417  C m0(a.dwmul(a.M,b.m));
418  C m1(a.dwmul(a.m,b.M));
419  if ( m0 > m1 ) m0 = m1;
420 
421  C M0(a.upmul(a.M,b.M));
422  C M1(a.upmul(a.m,b.m));
423  if ( M0 < M1 ) M0 = M1;
424 
425  x.m = m0;
426  x.M = M0;
427 };
428 
429 template<class C, int r> inline void
430 div( Interval<C,r>& a, const C& x ) {
431  if ( x > 0 )
432  {
433  a.m = a.dwdiv(a.m,x);
434  a.M = a.updiv(a.M,x);
435  }
436  else
437  {
438  C sv(a.m);
439  a.m = a.dwdiv(a.M,x);
440  a.M = a.updiv(sv,x);
441  };
442 };
443 
444 template<class C, int r> inline void
445 div( Interval<C,r>& a, const Interval<C,r>& b, const C& x ) {
446  if ( &a == &b ) { div(a,x); return; };
447  if ( x > 0 )
448  {
449  a.m = a.dwdiv(b.m,x);
450  a.M = a.updiv(b.M,x);
451  }
452  else
453  {
454  a.m = a.dwdiv(b.M,x);
455  a.M = a.updiv(b.m,x);
456  };
457 };
458 
459 template<class C, int r> inline void
460 div( Interval<C,r>& a, const C& x, const Interval<C,r>& b ) {
461  if ( x > 0 )
462  {
463  a.m = a.dwdiv(x,b.M);
464  a.M = a.updiv(x,b.m);
465  }
466  else
467  {
468  a.m = a.dwdiv(x,b.m);
469  a.M = a.updiv(x,b.M);
470  };
471 };
472 
473 template<class C, int r> inline void
475  if ( a.m > 0 )
476  {
477  if ( b.m > 0 )
478  {
479  a.m = a.dwdiv(a.m,b.M);
480  a.M = a.updiv(a.M,b.m);
481  return;
482  };
483  if ( b.M < 0 )
484  {
485  C sv(a.m);
486  a.m = a.dwdiv(a.M,b.M);
487  a.M = a.updiv(sv,b.m);
488  return;
489  };
490  if ( r == 3 )
491  {
492  throw typename Interval<C,r>::extended(a.updiv(a.m,b.m),a.dwdiv(a.M,b.M));
493  };
494  };
495 
496  if ( a.M < 0 )
497  {
498  if ( b.m > 0 )
499  {
500  a.m = a.dwdiv(a.m,b.m);
501  a.M = a.updiv(a.M,b.M);
502  return;
503  };
504 
505  if ( b.M < 0 )
506  {
507  C sv(a.m);
508  a.m = a.dwdiv(a.M,b.m);
509  a.M = a.updiv(sv,b.M);
510  return;
511  };
512 
513  if ( r == 3 )
514  {
515  throw typename Interval<C,r>::extended(a.updiv(a.m,b.M),a.dwdiv(a.M,b.m));
516  };
517  }
518 
519  if ( b.m > 0 )
520  {
521  a.m = a.dwdiv(a.m,b.m);
522  a.M = a.updiv(a.M,b.m);
523  return ;
524  };
525 
526  if ( b.M < 0 )
527  {
528  C sv(a.m);
529  a.m = a.dwdiv(a.M,b.m);
530  a.M = a.updiv(sv,b.m);
531  return;
532  };
533  if ( r == 3 ) throw typename Interval<C,r>::extended(0,0);
534 };
535 
536 template<class C, int r> inline void
537 div( Interval<C,r>& x, const Interval<C,r>& a, const Interval<C,r>& b ) {
538  /*
539  if ( b.m > 0 )
540  {
541  if ( a.m > 0 ) {
542  x.m = a.dwdiv(a.m,b.M);
543  x.M = a.updiv(a.M,b.m);
544  }
545  else x.m = a.dwdiv(a.m,b.m);
546  return;
547  }
548  if ( b.M < 0 )
549  {
550 
551  };
552 
553  */
554  switch( sign(a.m) )
555  {
556  case 1:
557  if ( b.m > 0 )
558  {
559  x.m = a.dwdiv(a.m,b.M);
560  x.M = a.updiv(a.M,b.m);
561  } else
562  if ( b.M < 0 )
563  {
564  x.m = a.dwdiv(a.M,b.M);
565  x.M = a.updiv(a.m,b.m);
566  }
567  else throw typename Interval<C,r>::extended(a.updiv(a.m,b.m),a.dwdiv(a.M,b.M));
568  break;
569  case -1:
570  if ( b.m > 0 )
571  {
572  x.m = a.dwdiv(a.m,b.m);
573  x.M = a.updiv(a.M,b.M);
574  }else
575  if ( b.M < 0 )
576  {
577  // C sv(a.M);
578  x.m = a.dwdiv(a.M,b.m);
579  x.M = a.updiv(a.m,b.M);
580  }
581  else throw typename Interval<C,r>::extended(a.updiv(a.m,b.M),a.dwdiv(a.M,b.m));
582  break;
583  case 0:
584  if ( b.m > 0 )
585  {
586  x.m = 0;
587  x.M = a.updiv(a.M,b.m);
588  }
589  else
590  if ( b.M < 0 )
591  {
592  x.m = a.dwdiv(a.M,b.m);
593  x.M = a.updiv(a.m,b.m);
594  }
595  else throw typename Interval<C,r>::extended(0,0);
596  break;
597  };
598 };
599 
600 
601 
602 
603 template<class C>
604 struct Intervals
605 {
610 };
611 
612 namespace let
613 {
614  template<class T, int r> void
615  assign( Interval<T,r>& i, const char * s ) {
616  int n = strlen(s)+1;
617  if ( *s == '[' )
618  {
619  char _s[ n ];
620  std::copy(s,s+n,_s);
621  char * sm = _s+1;
622  char * sM = _s+1;
623  while ( *sM != ',' ) sM++;
624  *sM = 0;
625  sM++;
626  char * e = sM;
627  while ( *e && *e != ']' ) e++;
628  *e = 0;
629  let::assign(i.m,(char*)sm);
630  let::assign(i.M,(char*)sM);
631  }
632  else
633  {
634  T tmp;
635  let::assign(tmp,(char*)s);
636  i.m = i.M = tmp;
637  };
638  };
639 }
640 
641 template<class C, int R> void
643  r.M = l.M;
644  r.m = (l.M+l.m)/C(2);
645  l.M = r.m;
646 };
647 
648 template<class C, int R> Interval<C,R>
650  Interval<C,R> res; neg(res,I); return res;
651 }
652 #define TMPL template<class Ca, int Na, class Cb, int Nb>
653 #define ARG0 Interval<Ca,Na>
654 #define ARG1 Interval<Cb,Nb>
655 TMPL typename texp::sup<ARG0,ARG1>::T operator+(const ARG0& Ia, const ARG1& Ib) {
656  typename texp::sup<ARG0,ARG1>::T res; add(res,Ia,Ib); return res;
657 }
658 TMPL typename texp::sup<ARG0,ARG1>::T operator-(const ARG0& Ia, const ARG1& Ib) {
659  typename texp::sup<ARG0,ARG1>::T res; sub(res,Ia,Ib); return res;
660 }
661 TMPL typename texp::sup<ARG0,ARG1>::T operator*(const ARG0& Ia, const ARG1& Ib) {
662  typename texp::sup<ARG0,ARG1>::T res; mul(res,Ia,Ib); return res;
663 }
664 TMPL typename texp::sup<ARG0,ARG1>::T operator/(const ARG0& Ia, const ARG1& Ib) {
665  typename texp::sup<ARG0,ARG1>::T res; div(res,Ia,Ib); return res;
666 }
667 
668 #undef ARG1
669 #undef TMPL
670 #define TMPL template<class Ca, int Na, class Cb>
671 #define ARG1 Cb
672 
673 TMPL typename texp::sup<ARG0,ARG1>::T operator+(const ARG0& Ia, const ARG1& Ib) {
674  typename texp::sup<ARG0,ARG1>::T res; add(res,Ia,(typename texp::sup<Ca,Cb>::T)Ib); return res;
675 }
676 TMPL typename texp::sup<ARG0,ARG1>::T operator-(const ARG0& Ia, const ARG1& Ib) {
677  typename texp::sup<ARG0,ARG1>::T res; sub(res,Ia,(typename texp::sup<Ca,Cb>::T)Ib); return res;
678 }
679 TMPL typename texp::sup<ARG0,ARG1>::T operator*(const ARG0& Ia, const ARG1& Ib) {
680  typename texp::sup<ARG0,ARG1>::T res; mul(res,Ia,(typename texp::sup<Ca,Cb>::T)Ib); return res;
681 }
682 TMPL typename texp::sup<ARG0,ARG1>::T operator/(const ARG0& Ia, const ARG1& Ib) {
683  typename texp::sup<ARG0,ARG1>::T res; div(res,Ia,(typename texp::sup<Ca,Cb>::T)Ib); return res;
684 }
685 //----------------------------------------------------------------------
686 TMPL typename texp::sup<ARG0,ARG1>::T operator+(const ARG1& Ia, const ARG0& Ib) {
687  typename texp::sup<ARG0,ARG1>::T res; add(res,Ib,(typename texp::sup<Ca,Cb>::T)Ia); return res;
688 }
689 TMPL typename texp::sup<ARG0,ARG1>::T operator-(const ARG1& Ia, const ARG0& Ib) {
690  typename texp::sup<ARG0,ARG1>::T res; add(res,-Ib,(typename texp::sup<Ca,Cb>::T)Ia); return res;
691 }
692 TMPL typename texp::sup<ARG0,ARG1>::T operator*(const ARG1& Ia, const ARG0& Ib) {
693  typename texp::sup<ARG0,ARG1>::T res; mul(res,Ib,(typename texp::sup<Ca,Cb>::T)Ia); return res;
694 }
695 TMPL typename texp::sup<ARG0,ARG1>::T operator/(const ARG1& Ia, const ARG0& Ib) {
696  typename texp::sup<ARG0,ARG1>::T res; div(res,Ib,(typename texp::sup<Ca,Cb>::T)Ia); return res;
697 }
698 
699 // declare_binary_operator(TMPL,ARG1,ARG0,_add_,operator+);
700 // declare_binary_operator(TMPL,ARG1,ARG0,_sub_,operator-);
701 // declare_binary_operator(TMPL,ARG1,ARG0,_mul_,operator*);
702 // declare_binary_operator(TMPL,ARG1,ARG0,_div_,operator/);
703 #undef TMPL
704 #undef ARG1
705 #define TMPL template<class Ca, int Na, class K>
706 #define ARG1 typename K::integer
707 TMPL typename texp::sup<ARG0,ARG1>::T operator+(const ARG0& Ia, const ARG1& Ib) {
708  typename texp::sup<ARG0,ARG1>::T res; add(res,Ia,(Ca)Ib); return res;
709 }
710 TMPL typename texp::sup<ARG0,ARG1>::T operator-(const ARG0& Ia, const ARG1& Ib) {
711  typename texp::sup<ARG0,ARG1>::T res; sub(res,Ia,(Ca)Ib); return res;
712 }
713 TMPL typename texp::sup<ARG0,ARG1>::T operator*(const ARG0& Ia, const ARG1& Ib) {
714  typename texp::sup<ARG0,ARG1>::T res; mul(res,Ia,Ib); return res;
715 }
716 TMPL typename texp::sup<ARG0,ARG1>::T operator/(const ARG0& Ia, const ARG1& Ib) {
717  typename texp::sup<ARG0,ARG1>::T res; div(res,Ia,Ib); return res;
718 }
719 // declare_binary_operator(TMPL,ARG0,ARG1,_add_,operator+);
720 // declare_binary_operator(TMPL,ARG0,ARG1,_sub_,operator-);
721 // declare_binary_operator(TMPL,ARG0,ARG1,_mul_,operator*);
722 // declare_binary_operator(TMPL,ARG0,ARG1,_div_,operator/);
723 
724  declare_binary_operator(TMPL,ARG1,ARG0,_add_,operator+);
725  declare_binary_operator(TMPL,ARG1,ARG0,_sub_,operator-);
726  declare_binary_operator(TMPL,ARG1,ARG0,_mul_,operator*);
727  declare_binary_operator(TMPL,ARG1,ARG0,_div_,operator/);
728 #undef ARG1
729 #undef TMPL
730 #define TMPL template<class Ca, int Na, class K>
731 #define ARG1 typename K::floating
732  declare_binary_operator(TMPL,ARG0,ARG1,_add_,operator+);
733  declare_binary_operator(TMPL,ARG0,ARG1,_sub_,operator-);
734  declare_binary_operator(TMPL,ARG0,ARG1,_mul_,operator*);
735  declare_binary_operator(TMPL,ARG0,ARG1,_div_,operator/);
736  declare_binary_operator(TMPL,ARG1,ARG0,_add_,operator+);
737  declare_binary_operator(TMPL,ARG1,ARG0,_sub_,operator-);
738  declare_binary_operator(TMPL,ARG1,ARG0,_mul_,operator*);
739  declare_binary_operator(TMPL,ARG1,ARG0,_div_,operator/);
740 #undef ARG1
741 #undef TMPL
742 #define TMPL template<class Ca, int Na, class K>
743 #define ARG1 typename K::rational
744  declare_binary_operator(TMPL,ARG0,ARG1,_add_,operator+);
745  declare_binary_operator(TMPL,ARG0,ARG1,_sub_,operator-);
746  declare_binary_operator(TMPL,ARG0,ARG1,_mul_,operator*);
747  declare_binary_operator(TMPL,ARG0,ARG1,_div_,operator/);
748  declare_binary_operator(TMPL,ARG1,ARG0,_add_,operator+);
749  declare_binary_operator(TMPL,ARG1,ARG0,_sub_,operator-);
750  declare_binary_operator(TMPL,ARG1,ARG0,_mul_,operator*);
751  declare_binary_operator(TMPL,ARG1,ARG0,_div_,operator/);
752 #undef ARG1
753 #undef ARG0
754 #undef TMPL
755 
756 //======================================================================
757 } //end namespace mmx
758 #endif
Interval()
default constructor sets values to zero
Definition: Interval_fcts.hpp:72
Definition: Interval.hpp:40
T upadd(const T &a, const T &b)
Definition: rounding_mode.hpp:86
void neg(Interval< C, r > &a)
Definition: Interval_fcts.hpp:200
Definition: Interval_fcts.hpp:23
const C & b
Definition: Interval_glue.hpp:25
Interval< C, 2 > rup_t
Definition: Interval_fcts.hpp:608
Definition: Interval.hpp:51
Interval< T, r > intersection(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:145
#define TMPL
Definition: Interval_fcts.hpp:742
const Interval & I
Definition: Interval_glue.hpp:49
void define(const T &m, const T &M)
Definition: Interval.hpp:77
static T updiv(const T &a, const T &b)
Definition: Interval_fcts.hpp:27
const T & upper() const
Definition: Interval.hpp:99
static T upadd(const T &a, const T &b)
Definition: Interval_fcts.hpp:29
T upper(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:89
bool with_plus_sign(const ZZ &c)
Definition: GMP.hpp:62
static T upmul(const T &a, const T &b)
Definition: Interval_fcts.hpp:48
static T upsub(const T &a, const T &b)
Definition: Interval_fcts.hpp:31
extended< NT > operator-(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:132
extended< NT > operator/(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:111
rnd()
Definition: Interval_fcts.hpp:59
declare_binary_operator(TMPL, ARG1, ARG0, _add_, operator+)
T upmul(const T &a, const T &b)
Definition: rounding_mode.hpp:94
static T dwsub(const T &a, const T &b)
Definition: Interval_fcts.hpp:41
static T dwdiv(const T &a, const T &b)
Definition: Interval_fcts.hpp:26
bool intersectp(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:140
bool intersect(Interval< T, r > &result, const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:150
static T updiv(const T &a, const T &b)
Definition: Interval_fcts.hpp:49
static T dwadd(const T &a, const T &b)
Definition: Interval_fcts.hpp:28
static T dwmul(const T &a, const T &b)
Definition: Interval_fcts.hpp:38
void mul(Interval< C, r > &a, const C &x)
Definition: Interval_fcts.hpp:259
Interval< C, 3 > autoround_t
Definition: Interval_fcts.hpp:609
void split(Interval< C, R > &l, Interval< C, R > &r)
Definition: Interval_fcts.hpp:642
extended< NT > operator+(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:122
Definition: rounding_mode.hpp:71
const T & lower() const
Definition: Interval.hpp:98
bool singleton(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:95
Interval< T, r > min(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:130
TMPL void copy(Polynomial &r, const Polynomial &a)
Copy of a in r.
Definition: sparse_monomials.hpp:613
bool in(const T &x, const Interval< T, r > &y)
Definition: Interval_fcts.hpp:100
void hull(Interval< T, r > &v, const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:120
#define min(a, b)
Definition: parser_def.c:475
void sub(Interval< C, r > &a, const C &x)
Definition: Interval_fcts.hpp:231
std::pair< Interval< T, r >, Interval< T, r > > bissect(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:104
#define Interval
Definition: Interval_glue.hpp:8
static T dwmul(const T &a, const T &b)
Definition: Interval_fcts.hpp:24
Definition: Interval_fcts.hpp:604
T updiv(const T &a, const T &b)
Definition: rounding_mode.hpp:98
ZZ size(const ZZ &z)
Definition: GMPXX.hpp:67
void abs(Interval< C, r > &x, const Interval< C, r > &a)
Definition: Interval_fcts.hpp:185
T dwmul(const T &a, const T &b)
Definition: rounding_mode.hpp:122
static T upmul(const T &a, const T &b)
Definition: Interval_fcts.hpp:25
T median(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:91
bool contain_zero(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:97
T lower(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:87
T dwsub(const T &a, const T &b)
Definition: rounding_mode.hpp:118
T size() const
same as width
Definition: Interval.hpp:127
T width(const Interval< T, r > &x)
Definition: Interval_fcts.hpp:93
T dwdiv(const T &a, const T &b)
Definition: rounding_mode.hpp:126
T upsub(const T &a, const T &b)
Definition: rounding_mode.hpp:90
Generic class for intervals.
Definition: Interval.hpp:44
static T upadd(const T &a, const T &b)
Definition: Interval_fcts.hpp:50
T m
Definition: Interval.hpp:52
Interval< C, 0 > simple_t
Definition: Interval_fcts.hpp:606
Interval< C, 1 > rdw_t
Definition: Interval_fcts.hpp:607
double C
Definition: solver_mv_fatarcs.cpp:16
#define ARG1
Definition: Interval_fcts.hpp:743
static T upsub(const T &a, const T &b)
Definition: Interval_fcts.hpp:51
sfirstnn< C, A, B >::T T
Definition: texp_sup.hpp:31
int sign(const QQ &a)
Definition: GMP.hpp:60
static T dwdiv(const T &a, const T &b)
Definition: Interval_fcts.hpp:39
void assign(A &a, const B &b)
Generic definition of the assignement function.
Definition: assign.hpp:97
Interval< T, r > max(const Interval< T, r > &a, const Interval< T, r > &b)
Definition: Interval_fcts.hpp:135
static T dwadd(const T &a, const T &b)
Definition: Interval_fcts.hpp:40
static T dwsub(const T &a, const T &b)
Definition: Interval_fcts.hpp:30
Definition: array.hpp:12
void div(Interval< C, r > &a, const C &x)
Definition: Interval_fcts.hpp:430
extended< NT > operator*(const extended< NT > &lhs, const extended< NT > &rhs)
Definition: extended.hpp:101
void add(dynamic_exp< E > &r, const dynamic_exp< E > &A, const dynamic_exp< E > &B)
Definition: dynamicexp.hpp:295
T width() const
return the width of the interval
Definition: Interval.hpp:125
T dwadd(const T &a, const T &b)
Definition: rounding_mode.hpp:114
#define ARG0
Definition: Interval_fcts.hpp:653
T M
Definition: Interval.hpp:52
Home