28 Şubat 2018 Çarşamba

numeric interval Sınıfı

Giriş
Şu satırı dahil ederiz.
#include <boost/numeric/interval.hpp> 
Kullanım
Kolay kullanmak için şu satırı dahil ederiz.
using namespace boost::numeric;
using namespace boost::numeric::interval_lib;
interval ile kullandığım metodlar boost::numeric::overlap (), boost::numeric::intersect  ()

Tanımlama
Örnek
Şöyle yaparız.
#include <boost/numeric/interval.hpp>
#include <boost/numeric/interval/rounded_arith.hpp>

using namespace std;
using namespace boost::numeric::interval_lib;
using namespace boost::numeric;

typedef interval<double,
                 policies<save_state<rounded_transc_std<double> >,
                 checking_base<double> > 
> Interval;
Örnek
Şöyle yaparız.
using Interval = boost::numeric::interval<
    double, bi::policies<
        bi::save_state<bi::rounded_transc_std<double> >, bi::checking_base<double> 
    > >;

Constructor - int + int
Şöyle yaparız.
Interval i (-1, 1);
Constructor - double + double
Şöyle yaparız.
typedef interval<double, policies<save_state<rounded_transc_std<double> >,
  checking_base<double> >   > Interval;
  
Interval i(1.0, 2.0);
Constructor - Interval
Şöyle yaparız.
Interval i = ...;
Interval i1 = cos (i);
operator * metodu
Şöyle yaparız.
Interval i{1.9, 2.1};
std::cout << (2.0 * i) << "\n";
std::cout << (i * 2.0) << "\n";
Çıktı olarak şunu alırız.
[3.8,4.2]
[3.8,4.2]
operator - metodu
Şöyle yaparız.
Interval result = (Interval(3.15, 4.6) - Interval(-0.6, 2.1));
cout << "result: " << result.lower() << " " << result.upper();
upper metodu
Şöyle yaparız.
template <typename T>
using Interval = interval<T, policies<save_state<rounded_transc_exact<T>>,
  checking_base<T>>>;

std::cout << sin(Interval<double>(0.0, 0.1)).upper() << "\n"; // 0.0998334
Diğer
sin metodu
Şöyle yaparız
#include <boost/numeric/interval.hpp>   

namespace bn = boost::numeric;
namespace bi = bn::interval_lib;

using Interval = bn::interval<
      double,
      bi::policies<
          bi::save_state<bi::rounded_transc_std<double> >,
          bi::checking_base<double>
      >
  >;
Şöyle yaparız.
Interval iv_arg {1.0};
Interval res = sin(iv_arg);
Örnek
Basit bir interval sınıfı şöyledir.
class interval {
  int upper, lower;
  interval(int upper,int lower){
    this.upper=upper;
    this.lower=lower;
  }

}
Sıralama
Şöyle yaparız.
bool compare(interval obj1, interval obj2) {
  return obj1.begin < obj2.begin;
}
Şöyle yaparız.
std::sort(schedule.begin(), schedule.end(), compare);
Overlap
interval'ların çakıştığını kontrol etmek için şöyle yaparız.
You can keep the existingTasks sorted by beginTime, and use Collections.binarySearch to obtain the index where to insert the new task, and compare with previous and next task. That, of course would be O(log(N))
Kendi overlap metodum
Şöyle yaparız.
bool intersect(interval a, interval b) {
  return (a.begin >= b.end || a.end <= b.begin);
}
Kendi intersect metodum
Şöyle yaparız.
#include <algorithm>

template <typename ...Ts>
auto intersection(const Ts&... ps)
{
  return std::make_pair(std::max({ps.first...}), std::min({ps.second...}));
}