osdir.com


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

Floating point overflow and underflow


Thanks Rob.

How would one initialize a Decimal with something like pow(2,256)?

On Tue, Jan 7, 2020 at 5:25 PM Rob Gaddi <rgaddi at highlandtechnology.invalid>
wrote:

> 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
> --
> https://mail.python.org/mailman/listinfo/python-list
>