Opened 6 years ago
Last modified 6 years ago
#12261 new Bugs
LT_HalfPrevLoT and GT_HalfSuccHiT are not symmetrical
Reported by: | Owned by: | Fernando Cacciola | |
---|---|---|---|
Milestone: | To Be Determined | Component: | numeric |
Version: | Boost 1.61.0 | Severity: | Problem |
Keywords: | Cc: |
Description
Reusing low boost conversion policies to implement my own roundToInt method...
If you try the following code:
template <class To, class From> struct NumericRangeCheckerTraits { typedef To target_type; typedef From source_type; typedef From argument_type; }; struct ToTextOverflowHandlerPolicy { void operator() ( boost::numeric::range_check_result result) { switch (result) { case boost::numeric::cInRange: std::cout << "the value is in range"<< std::endl; break; case boost::numeric::cNegOverflow: case boost::numeric::cPosOverflow: std::cout << "the value is out of range"<< std::endl; break; } }; }; double dmax = std::numeric_limits<int>::max() + 0.5; double dmin = std::numeric_limits<int>::min() - 0.5; boost::numeric::convdetail::generic_range_checker<NumericRangeCheckerTraits<int, double>, boost::numeric::convdetail::LT_HalfPrevLoT<NumericRangeCheckerTraits<int, double>>, boost::numeric::convdetail::GT_HalfSuccHiT<NumericRangeCheckerTraits<int, double>>, ToTextOverflowHandlerPolicy>::validate_range(dmax); boost::numeric::convdetail::generic_range_checker<NumericRangeCheckerTraits<int, double>, boost::numeric::convdetail::LT_HalfPrevLoT<NumericRangeCheckerTraits<int, double>>, boost::numeric::convdetail::GT_HalfSuccHiT<NumericRangeCheckerTraits<int, double>>, ToTextOverflowHandlerPolicy>::validate_range(dmin);
You will get:
the value is out of range the value is in range
When they should be both out of range.
This is because GT_HalfSuccHiT should implement range_check_result as such:
static range_check_result apply ( argument_type s ) { return s > static_cast<S>(bounds<T>::highest()) + static_cast<S>(0.5) ? cPosOverflow : cInRange ;
instead of using >=.
The comment to describe GT_HalfSuccHiT should be changed as well to:
// s > Highest(T) + 0.5 ? cPosgOverflow : cInRange
Change History (3)
comment:1 by , 6 years ago
Owner: | changed from | to
---|
comment:2 by , 6 years ago
Component: | convert → numeric |
---|---|
Owner: | changed from | to
comment:3 by , 6 years ago
This is indeed an issue on Boost.NumericConversion and I'll try to take a detailed look next week.
Note:
See TracTickets
for help on using tickets.
I do not believe that is a Boost.Convert issue. I am under impression that it is Boost.NumericConversion by Fernando.