相当于 float128

Equivalent of float128

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

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

是否可以为给定操作设置精度 "locally",而不是使用 getcontext().prec 设置精度 "globally"?

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

遗憾的是,Python 仅支持一种浮点类型,即底层架构的双精度类型。

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

如果你在 numpy 之外需要它,(或者在 numpy 不支持它的平台上),你可以看看 bigfloat package on pypi which is a wrapper around GNU MPFR library。但请注意,它目前处于测试版级别,您必须准备好从源代码构建它。


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

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

这里是一个简单的例子,展示了 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 位格式的上下文。开发分支支持更广泛的精度。