Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Equivalent of float128

How to work with equivalent of __float128 in Python? What precision should I use for decimal.getcontext()? I mean, is the precision specified in decimal places or bits?

from decimal import *
getcontext().prec = # 34 or 128 ?

Is it possible to set the precision "locally" for a given operation, rather than setting it "globally" with getcontext().prec?

Per Simon Byrne comment, is it even possible to simulate __float128 as defined by IEEE 754 with Decimal? What other options do I have in Python, if I wanted quadruple-precision?

like image 792
Ecir Hana Avatar asked Sep 16 '25 09:09

Ecir Hana


2 Answers

I'm the maintainer of gmpy2. In addition to wrapping MPFR, gmpy2 also wraps GMP (for integer and rational numbers) and MPC (for complex arithmetic). Both MPFR and MPC use a binary representation compared to Decimal which uses a decimal representation.

Here is a quick example showing use of the equivalent of float128.

>>> import gmpy2
>>> gmpy2.set_context(gmpy2.ieee(128))
>>> gmpy2.get_context()
context(precision=113, real_prec=Default, imag_prec=Default,
        round=RoundToNearest, real_round=Default, imag_round=Default,
        emax=16384, emin=-16493,
        subnormalize=True,
        trap_underflow=False, underflow=False,
        trap_overflow=False, overflow=False,
        trap_inexact=False, inexact=False,
        trap_invalid=False, invalid=False,
        trap_erange=False, erange=False,
        trap_divzero=False, divzero=False,
        trap_expbound=False,
        allow_complex=False)
>>> gmpy2.sin(gmpy2.mpfr("1.2"))
mpfr('0.932039085967226349670134435494826026',113)

For the 2.0.x series, gmpy2.ieee() only creates contexts for supporting 32, 64, or 128-bit formats. The development branch supports are wider range of precisions.

like image 105
casevh Avatar answered Sep 17 '25 22:09

casevh


Unfortunately, Python has native support for only one single floating point type, the double type of the underlying architecture.

Depending on the architecture, numpy can declare a float128, but it is known not to be consistently available.

If you need it outside of numpy, (or on a platform where numpy does not support it), you could have a look the the bigfloat package on pypi which is a wrapper around GNU MPFR library. But beware, it is currently declared at beta level and you must be prepared to build it from sources.


After @MarkDickinson's comment (he is the author of bigfloat), gmpy2 is another wrapper around MPFR which is declared stable on pypi and is both richer and better maintained.

like image 41
Serge Ballesta Avatar answered Sep 17 '25 21:09

Serge Ballesta



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!