osdir.com


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Floating point overflow and underflow


On 1/7/20 3:47 PM, Shashank Tiwari wrote:
> In Python3 an operation as follows:
>>>> 10135.1941 * (10**8)
> gives the result: 1013519410000.0001
> 
> Similarly, using the pow function also gives the same overflow/underflow
> error.
>>>> 10135.1941 * pow(10,8)
> 1013519410000.0001
> 
> Like multiplication, division of large or very small floating point numbers
> gives similar overflow/underflow errors.
> 
> Usage of Decimal doesn't seem to fix it either.
>>>> from decimal import *
>>>> Decimal(10135.1941 * pow(10,8))
> Decimal('1013519410000.0001220703125')
>>>> Decimal(10135.1941)*pow(10,8)
> Decimal('1013519410000.000061700120568')
>>>> Decimal(10135.1941) * Decimal(pow(10,8))
> Decimal('1013519410000.000061700120568')
>>>> Decimal(10135.1941 * (10**8))
> Decimal('1013519410000.0001220703125')
> 
> How could one do high precision multiplication and division of floating
> points numbers (decimals) in Python3 without any overflow/underflow errors?
> 
> Thanks, Shanky
> 

You've already polluted your Decimal with floating-point roundoff error before 
you even multiply it in any of your examples.

 >>> Decimal(10135.1941)
Decimal('10135.1941000000006170012056827545166015625')

Initialize your Decimal from a string instead.

 >>> Decimal('10135.1941')
Decimal('10135.1941')
 >>> Decimal('10135.1941') * Decimal('1e8')
Decimal('1.01351941E+12')
 >>> float(_)
1013519410000.0