|
Boost : |
From: Paul A. Bristow (boost_at_[hidden])
Date: 2003-04-11 06:20:05
In sucessfully using intervals with Stats code from Neal Becker, I had some
minor dificulties:
1 abs
It took me some fumbling to see that I needed
using namespace boost::numeric; // BEFORE
#include "stats.hpp"
In doing do, I found that
typedef boost::numeric::interval<double> I;
I x = -2.;
I x = boost::numeric::abs(x);
works as expected, but I was puzzled that
using boost::numeric::abs;
T absx = abs(x); // failed (with MSVC 7.0) because interval policies not found.
I absx = boost::numeric::abs< boost::numeric::interval<double> >(x);
testInterval.cpp(96) : error C2783: 'boost::numeric::interval<T,Policies>
boost::numeric::abs(const boost::numeric::interval<T,Policies> &)'
: could not deduce template argument for 'Policies'
or
I absx = abs(x);
testInterval.cpp(96) : error C2664: 'abs' : cannot convert parameter 1 from 'I'
to 'int'
No user-defined-conversion operator available that can perform this
conversion, or the operator cannot be called
2 I found several places where expressions like T mean/integer count failed
when T was an interval type. This is because there is no conversion from
integer, though there is from double etc. writing mean/T(count) works OK.
I half_x = x/2; // fails
I half_x = x/2.0; // OK
I half_x = x/ I(2); // OK
This is a very common situation and would be helpful to avoid widespread changes
to existing code - but perhaps this is an exercise for the student :-)
3 I found
using boost::numeric::pow;
x1 = pow(x, 2); // multiplicative_inverse undeclared in arith2.hpp
required addition of explicit interval_lib::
return interval_lib::multiplicative_inverse(pow(x, -pwr));
// return multiplicative_inverse(pow(x, -pwr)); // was
4 x1 = exp(x); // fails - exp_up and exp_down not a member ...
I:/boost_1_30_0\boost\numeric\interval\transc.hpp(39) : error C2039: 'exp_up' :
is not a member of 'boost::numeric::interval_lib::rounded_math<T>'
with
[
T=double
]
I:/boost_1_30_0\boost\numeric\interval\hw_rounding.hpp(50) : see
declaration of 'boost::numeric::interval_lib::rounded_math<T>'
with
[
T=double
]
5 similarly with log_up and log_down.
6 Using interval pi I was puzzled that:
using boost::numeric::interval_lib::pi< boost::numeric::interval<double> >; //
triggers compile fail at pi<I>()
using boost::numeric::interval_lib::pi; // illegal use of expression
I pi_d = pi<I>();
whereas
using namespace boost::numeric::interval_lib;
I pi_d = pi<I>();
and
I pi_d = boost::numeric::interval_lib::pi< boost::numeric::interval<double>
>();
are fine.
But overall I hope this shows a real-life use of interval arithmetic which I
believe has considerable potential usefulness.
Thanks
Paul
> -----Original Message-----
> From: boost-bounces_at_[hidden]
> [mailto:boost-bounces_at_[hidden]]On Behalf Of Paul A. Bristow
> Sent: Thursday, April 10, 2003 3:30 PM
> To: Boost mailing list
> Subject: RE: [boost] Statistics code example
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk