I have the following test code
#include <boost/numeric/interval.hpp>
#include <iostream>
#include <limits>
int main() {
using Interval = boost::numeric::interval<double>;
using dbl = std::numeric_limits< double >;
std::cout << std::setprecision(dbl::max_digits10) << std::endl ;
for (int j = 0; j < 100; j++) {
double lower = -j;
double upper = j;
double tol = 0.1;// 1e-12;
Interval i{lower, upper};
double lower_ = lower + tol;
double upper_ = upper - tol;
Interval i_ = widen(i, -tol);
if (lower_ != i_.lower() || upper_ != i_.upper()) {
std::cout
<< " error "
<< lower_ << "," << upper_
<< " "
<< i_.lower() << "," << i_.upper()
<< std::endl;
}
}
}
and the output is
error -1.8999999999999999,1.8999999999999999 -1.9000000000000001,1.9000000000000001
error -2.8999999999999999,2.8999999999999999 -2.9000000000000004,2.9000000000000004
error -3.8999999999999999,3.8999999999999999 -3.9000000000000004,3.9000000000000004
error -16.899999999999999,16.899999999999999 -16.900000000000002,16.900000000000002
error -17.899999999999999,17.899999999999999 -17.900000000000002,17.900000000000002
error -18.899999999999999,18.899999999999999 -18.900000000000002,18.900000000000002
error -19.899999999999999,19.899999999999999 -19.900000000000002,19.900000000000002
error -20.899999999999999,20.899999999999999 -20.900000000000002,20.900000000000002
error -21.899999999999999,21.899999999999999 -21.900000000000002,21.900000000000002
error -22.899999999999999,22.899999999999999 -22.900000000000002,22.900000000000002
error -23.899999999999999,23.899999999999999 -23.900000000000002,23.900000000000002
error -24.899999999999999,24.899999999999999 -24.900000000000002,24.900000000000002
error -25.899999999999999,25.899999999999999 -25.900000000000002,25.900000000000002
error -26.899999999999999,26.899999999999999 -26.900000000000002,26.900000000000002
error -27.899999999999999,27.899999999999999 -27.900000000000002,27.900000000000002
error -28.899999999999999,28.899999999999999 -28.900000000000002,28.900000000000002
error -29.899999999999999,29.899999999999999 -29.900000000000002,29.900000000000002
error -30.899999999999999,30.899999999999999 -30.900000000000002,30.900000000000002
error -31.899999999999999,31.899999999999999 -31.900000000000002,31.900000000000002
error -32.899999999999999,32.899999999999999 -32.900000000000006,32.900000000000006
error -33.899999999999999,33.899999999999999 -33.900000000000006,33.900000000000006
error -34.899999999999999,34.899999999999999 -34.900000000000006,34.900000000000006
error -35.899999999999999,35.899999999999999 -35.900000000000006,35.900000000000006
error -36.899999999999999,36.899999999999999 -36.900000000000006,36.900000000000006
error -37.899999999999999,37.899999999999999 -37.900000000000006,37.900000000000006
error -38.899999999999999,38.899999999999999 -38.900000000000006,38.900000000000006
error -39.899999999999999,39.899999999999999 -39.900000000000006,39.900000000000006
error -40.899999999999999,40.899999999999999 -40.900000000000006,40.900000000000006
error -41.899999999999999,41.899999999999999 -41.900000000000006,41.900000000000006
error -42.899999999999999,42.899999999999999 -42.900000000000006,42.900000000000006
error -43.899999999999999,43.899999999999999 -43.900000000000006,43.900000000000006
error -44.899999999999999,44.899999999999999 -44.900000000000006,44.900000000000006
error -45.899999999999999,45.899999999999999 -45.900000000000006,45.900000000000006
error -46.899999999999999,46.899999999999999 -46.900000000000006,46.900000000000006
error -47.899999999999999,47.899999999999999 -47.900000000000006,47.900000000000006
error -48.899999999999999,48.899999999999999 -48.900000000000006,48.900000000000006
error -49.899999999999999,49.899999999999999 -49.900000000000006,49.900000000000006
error -50.899999999999999,50.899999999999999 -50.900000000000006,50.900000000000006
error -51.899999999999999,51.899999999999999 -51.900000000000006,51.900000000000006
error -52.899999999999999,52.899999999999999 -52.900000000000006,52.900000000000006
error -53.899999999999999,53.899999999999999 -53.900000000000006,53.900000000000006
error -54.899999999999999,54.899999999999999 -54.900000000000006,54.900000000000006
error -55.899999999999999,55.899999999999999 -55.900000000000006,55.900000000000006
error -56.899999999999999,56.899999999999999 -56.900000000000006,56.900000000000006
error -57.899999999999999,57.899999999999999 -57.900000000000006,57.900000000000006
error -58.899999999999999,58.899999999999999 -58.900000000000006,58.900000000000006
error -59.899999999999999,59.899999999999999 -59.900000000000006,59.900000000000006
error -60.899999999999999,60.899999999999999 -60.900000000000006,60.900000000000006
error -61.899999999999999,61.899999999999999 -61.900000000000006,61.900000000000006
error -62.899999999999999,62.899999999999999 -62.900000000000006,62.900000000000006
error -63.899999999999999,63.899999999999999 -63.900000000000006,63.900000000000006
Can somebody please explain why widen is not doing exactly the same as manually applying the widening to the limits.
See https://godbolt.org/z/fonMrGj74 for a live demo