On Thu, 15 Jan 2015, Павел Кудан wrote:
I tried the following program:
#include <boost/numeric/interval.hpp> #include <iostream>
typedef boost::numeric::interval<double> I; int main(){ I a(1,2); I b(-1,1); std::cout << lower(a) << ',' << upper(a) << std::endl; std::cout << lower(b) << ',' << upper(b) << std::endl; a/=b; std::cout << lower(a) << ',' << upper(a) << std::endl; }
and it prints:
1,2 -1,1 -inf,inf
and not -inf,-1 as you claim. If you have code showing a different result, please post it. I can't see anything in the documentation that supports your claim.
[-inf,inf] is the smallest interval containing all possible values for the quotient, so it makes a lot of sense to return that. Now, if I understand correctly, you would like to add a policy so that anytime an operation has a disconnected image, instead of bridging the gap, boost would throw. That would be useless in my applications (well, maybe a shortcut since once I get [-inf,inf] somewhere it tends to propagate, eventually to a comparison that will throw), but maybe it makes sense for yours... In any case, it doesn't look like it would hurt boost to add such an optional policy. So if you want to prepare a patch, someone might be willing to review and pull it.
In that case [-inf, inf] should be a result of any operation in the world :) As it is universal :)))
Note the word "smallest" in my explanation.
2 + 2 == [-inf, inf], is it true? :)
Of course - as it is somewhere between :)
Not true? Of course, not.
2 + 2 != [-inf, inf] and [-inf, inf] != [-inf, 1] U [1, inf]
[-inf,inf] is the smallest interval containing both [-inf, 1] and [1, inf]. It isn't possible to return a smaller interval that still contains all possible values.
Let's see presentation about boost interval and interval arithmetic.
https://www.lri.fr/~melquion/doc/03-rnc5-expose.pdf
On page 11: Functions can also be used to compute a pair of intervals: [1, 2] ÷ [−1, 1] = [−∞, −1] ∪ [1, +∞]. (that is not boost interval operator / yet, it is basic arithmetic operation for interval. That is what should be a result)
also, on page 5: [a, b] × [c, d] = [min(ac, bc, ad, bd), max(ac, bc, ad, bd)], [a, b] ÷ [c, d] = [a, b] × [1 ÷ d, 1 ÷ c] if 0 NOT ∈ [c, d]
(that is not boost interval operator / yet, but it is the way its result is calculated when zero is not inside of [c, d] interval (by the way, typo here - must be 'if 0 NOT ∈ (c, d)). And here official boost interval documentation
http://www.boost.org/doc/libs/1_37_0/libs/numeric/interval/doc/interval.htm
The operators / and /= will try to produce an empty interval if the denominator is exactly zero. If the denominator contains zero (but not only zero), the result will be the smallest interval containing the set of division results; so one of its bound will be infinite, but it may not be the whole interval.
So, official documented result of / operator for that case is [-inf, 1] as it is smallest interval (the result of division_part1() function of boost interval class). And this result is not correct as it is not full.
Language barrier. You are grossly misunderstanding the documentation. "The set of division results" is [-inf,-1] union [1,inf]. "The smallest interval containing" this set is [-inf,inf]. It is NOT the same thing as the smallest connected component of the set. -- Marc Glisse