相当于float128

时间:2017-02-01 09:13:33

标签: python floating-point precision arbitrary-precision

如何在Python中使用等效的__float128?我应该对decimal.getcontext()使用什么精度?我的意思是,精度是用小数位还是位指定的?

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

是否可以在本地设置精度"对于给定的操作,而不是设置它"全局"与getcontext().prec

根据Simon Byrne的评论,是否可以使用__float128模拟IEEE 754定义的Decimal?如果我想要四倍精度,我在Python中还有哪些其他选项?

2 个答案:

答案 0 :(得分:2)

我是gmpy2的维护者。除了包装MPFR之外,gmpy2还包含GMP(对于整数和有理数)和MPC(对于复数运算)。与使用十进制表示的Decimal相比,MPFR和MPC都使用二进制表示。

以下是一个使用等效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)

对于2.0.x系列,gmpy2.ieee()仅创建支持32位,64位或128位格式的上下文。开发分支支持更广泛的精度。

答案 1 :(得分:1)

不幸的是,Python只支持一种浮点类型,即底层架构的双重类型。

根据体系结构的不同,numpy可以声明一个float128,但是众所周知,它不能始终可用。

如果您需要在numpy之外,(或在numpy不支持它的平台上),您可以查看bigfloat package on pypi这是GNU MPFR library的包装器。但请注意,它目前已在beta级别声明,您必须准备从源代码构建它。

在@MarkDickinson的评论(他是bigfloat的作者)之后,gmpy2是围绕MPFR的另一个包装器,它在pypi上声明稳定,并且更丰富,维护得更好。