### 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

```