Boost logo

Boost :

From: Jonathan Turkanis (technews_at_[hidden])
Date: 2005-04-04 16:10:24


Peter Dimov wrote:
> Andy Little wrote:
>> "Peter Dimov" <pdimov_at_[hidden]> wrote in message
>> news:00aa01c536c0$66dd7f60$6601a8c0_at_pdimov...
>>> Jonathan Turkanis wrote:
>>>> No, I was claiming that in some cases a developer might know the
>>>> range of all possible inputs, and be able to reason that no
>>>> overflow could occur.
>>>
>>> You do understand that the range of the inputs has almost nothing to
>>> do with overflow, right?
>>
>> There is a safe range of values for each operation.
>> eg for an implementation of rational addition where Rationalx = Nx/
>> Dx and operator + is implemented as :
>>
>> (N1 * D2 + N2 * D1 ) "/ "(D1 * D2)
>>
>> Assuming the same maximaum allowable value for each of N1, D1, N2, D2
>> max value of ( N1 * D2 + N2 * D1) occurs when
>> N1 == D1 == D2 == N2,
>> max value of (D1 *D2) when D1 == D2,
>>
>> therefore max allowable value of all these is:
>>
>> sqrt(double(std::numeric_limits<int_type>::max()/2)) .
>>
>> For a 16bit int this leaves you with a safe range of +-127 in this
>> case.Of course after 'normalisation' referred to in the
>> boost::rational docs, the result of the addition itself may or may
>> not be out of range.
>
> True, but if your computations do not consist of a single addition,
> you'll see you "conservative" range shrinking down rapidly to [1, 1]
> for the denominator. ;-)
>
> The real answer is that rational addition is rational-overflow-safe
> (as opposed to ordinary integer-overflow-safe) if Di == Dj (or the
> equivalent where all D's divide some Di). That is, when I could have
> used integer arithmetic instead of rational.

You can always use integer arithmetic instead. ;-)

> This is perhaps an important use case. However it is completely
> unaffected by rounding (which never occurs in this scenario.) Hence, rational
> can be improved to support another use case (floating point
> replacement) without affecting its current users.

I basically agree except for the question of whether specifying rounding
behavior could lock in an inefficient implementation.

Jonathan


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk