[Boost-bugs] [ boost-Patches-1438991 ] rational::operator<(rational) fails due to overflow

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[Boost-bugs] [ boost-Patches-1438991 ] rational::operator<(rational) fails due to overflow

SourceForge.net
Patches item #1438991, was opened at 2006-02-26 07:54
Message generated for change (Comment added) made by dbenbenn
You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=307586&aid=1438991&group_id=7586

Please note that this message will contain a full copy of the comment thread,
including the initial issue submission, for this request,
not just the latest update.
Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: David Benbennick (dbenbenn)
Assigned to: Nobody/Anonymous (nobody)
Summary: rational::operator<(rational) fails due to overflow

Initial Comment:
Consider boost::rational<long>.  Pick two objects of
that type at random (that's well defined, since there
are only finitely many objects of that type), and pick
them to both have the same sign.  Call them a and b.
Then the expression "a < b" returns the wrong value 50%
of the time!  The problem is that the calculation in
rational.hpp can overflow, and that overflow actually
happens most of the time.

Here's a patch that implements operator< without
overflow.  It's somewhat less efficient (I haven't
benchmarked it) but it gives the right answer.

Possibly the new version of operator< has bugs.  I've
run a few hundred million random tests, with the right
answer every time (I've used bc to check the answers),
but there might be a subtle problem.  In particular,
the new code assumes that integer division always
truncates towards 0, even when dividing negative
integers.  Perhaps that is not true on some obscure
platforms/compilers?

----------------------------------------------------------------------

>Comment By: David Benbennick (dbenbenn)
Date: 2006-03-07 16:08

Message:
Logged In: YES
user_id=95581

Here's a new patch that uses std::numeric_limits to select
the more efficient, direct comparison method for unbounded
types, and only uses the overflow-avoiding method for types
that can overflow.

----------------------------------------------------------------------

You can respond by visiting:
https://sourceforge.net/tracker/?func=detail&atid=307586&aid=1438991&group_id=7586


-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
Boost-bugs mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/boost-bugs
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost