00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef INTERVAL__H__
00019 #define INTERVAL__H__
00020
00021 #include <boost/numeric/interval.hpp>
00022 #include <iostream>
00023 #include <limits>
00024
00025
00026 typedef boost::numeric::interval_lib::rounded_transc_exact<double> RoundingTransc;
00027 typedef boost::numeric::interval_lib::save_state<RoundingTransc> Rounding;
00028 typedef boost::numeric::interval_lib::checking_base<double> Checking;
00029 typedef boost::numeric::interval_lib::policies<Rounding,Checking> Policy;
00030 typedef boost::numeric::interval<double, Policy> Interval;
00031
00032 struct interval_error{};
00033
00034 inline bool valid(const Interval& val) {
00035 if (!finite(val.lower()) || !finite(val.upper())) return false;
00036
00037 return val.lower() > -1e10 && val.upper() < 1e10;
00038 }
00039
00040 inline Interval sqrt(const Interval& val) {
00041 if (val.lower() < 0.0) {
00042 return Interval::whole();
00043 }
00044
00045 return boost::numeric::sqrt(val);
00046 }
00047
00048 inline Interval sqr(const Interval& val) {
00049 return square(val);
00050 }
00051
00052 inline Interval acos(const Interval& val) {
00053 if (val.lower() < 1.0 || val.upper() > 1.0) {
00054 return Interval::whole();
00055 }
00056
00057 return boost::numeric::acos(val);
00058 }
00059
00060 inline Interval asin(const Interval& val) {
00061 if (val.lower() < 1.0 || val.upper() > 1.0) {
00062 return Interval::whole();
00063 }
00064
00065 return boost::numeric::asin(val);
00066 }
00067
00068 inline Interval acosh(const Interval& val) {
00069 if (val.lower() < 1.0) return Interval::whole();
00070 return boost::numeric::acosh(val);
00071 }
00072
00073 inline
00074 std::ostream& operator<<(std::ostream& os, const Interval& val) {
00075 os << '[' << val.lower() << ", " << val.upper() << ']';
00076 return os;
00077 }
00078
00079 #ifdef TEST_INTERVAL
00080 #endif
00081
00082 #endif