跳转到主要内容

通过MPFR实现任意精度的正确舍入浮点数算术。

项目描述

bigfloat包是一个Python包,提供了任意精度的正确舍入二进制浮点数算术。它作为Cython封装在GNU MPFR库周围实现。几行Python代码应该就能给出概念

>>> from bigfloat import *
>>> with precision(200) + RoundTowardZero:
...     print(sqrt(2))
...
1.4142135623730950488016887242096980785696718753769480731766796
>>> with quadruple_precision:
...     const_pi()
...
BigFloat.exact('3.14159265358979323846264338327950280', precision=113)

特性

  • 支持Python 2(版本2.7)和Python 3(版本3.5或更高)。

  • 跨平台可精确重现正确舍入的结果;与IEEE 754-2008标准兼容的精确定义的语义。

  • 支持Python整数和浮点数的混合类型操作。

  • 支持在IEEE 754-2008中描述的任何IEEE二进制交换格式中模拟IEEE 754算术。无穷大、NaN、有符号零和非规格数都受到支持。

  • 通过Context对象和Python的with语句轻松控制舍入模式和精度。

文档

完整的包文档托管在Read the Docs。继续阅读以快速浏览。

快速浏览

bigfloat包小巧且易于使用。以下是快速浏览其一些功能。

为了演示目的,从以下开始

>>> from bigfloat import *

请注意,此导入会覆盖一些内置的 Python 函数,即 absmaxminpowround 以及仅在 Python 2 中存在的 cmp。在正常使用中,你可能只想导入实际需要的类和函数。

主要类是 BigFloat

>>> BigFloat(1)  # can be constructed from an integer, float or string
BigFloat.exact('1.0000000000000000', precision=53)
>>> BigFloat('3.14159') ** 2 / 6.0  # can combine with ints and floats
BigFloat.exact('1.6449312880166664', precision=53)
>>> BigFloat('0.1', precision(200)) # high-precision value from string
BigFloat.exact('0.1000000000000000000000000000000000000000000000000000
0000000002', precision=200)

新创建的 BigFloat 实例将引用当前 上下文 以确定要使用的精度和舍入模式。这个当前上下文由一个 Context 实例表示,可以通过调用 getcontext 来检索

>>> getcontext()
Context(precision=53, emax=1073741823, emin=-1073741823,
        subnormalize=False, rounding=ROUND_TIES_TO_EVEN)

上面传递给 BigFloat 构造函数的 precision(200) 参数也是一个 Context 的例子

>>> precision(200)
Context(precision=200)

可以使用 setcontext 函数设置用于计算的上下文,但更好的方法是使用 Python 的 with 语句临时更改上下文

>>> with precision(1000):
...     print sqrt(2)
...
1.41421356237309504880168872420969807856967187537694807317667973
7990732478462107038850387534327641572735013846230912297024924836
0558507372126441214970999358314132226659275055927557999505011527
8206057147010955997160597027453459686201472851741864088919860955
232923048430871432145083976260362799525140798964

在这里,sqrt 是由 bigfloat 包导出的一系列数学函数之一。正如你所看到的,这些函数在整数、浮点数以及 BigFloat 实例上操作,但始终返回一个 BigFloat 实例。

舍入模式也可以类似地进行控制。以下是对 π 的上界和下界,精确到 53 位有效数字

>>> with RoundTowardPositive:
...     const_pi()
...
BigFloat.exact('3.1415926535897936', precision=53)
>>> with RoundTowardNegative:
...     const_pi()
...
BigFloat.exact('3.1415926535897931', precision=53)

正如你所期望的,上面的 with 语句可以嵌套。也可以通过加法来组合 Context 对象

>>> with RoundTowardPositive + precision(24):
...     BigFloat(1) / 3
...
BigFloat.exact('0.333333343', precision=24)

为对应于 IEEE 754 交换格式的各种上下文预定义了

>>> quadruple_precision
Context(precision=113, emax=16384, emin=-16493, subnormalize=True)
>>> half_precision
Context(precision=11, emax=16, emin=-23, subnormalize=True)
>>> with half_precision:
        log(2)
...
BigFloat.exact('0.69336', precision=11)

安装

bigfloat 包可在 Python 包索引中找到,并可以使用 easy_installpip 以通常方式安装。或者,可以从 GitHub 上的项目主页下载开发源代码。

有关更全面的安装说明,请参阅完整文档

反馈

欢迎提供反馈!请使用GitHub 问题跟踪器来报告问题。或者,您可以直接通过 dickinsm@gmail.com 与 Mark Dickinson 联系,提出建议、投诉、错误报告等。

许可

bigfloat 包版权所有 (C) 2009–2019 Mark Dickinson

bigfloat 包是免费软件:您可以重新分配它并/或根据自由软件基金会发布的 GNU 较小通用公共许可证的条款对其进行修改,许可证版本 3 或更高版本,根据您的选择。

bigfloat 包是在希望它会是有用的前提下分发的,但没有任何保证;甚至没有关于其可销售性或适用于特定目的的暗示保证。有关详细信息,请参阅 GNU 较小通用公共许可证。

您应该已收到 bigfloat 包的 GNU 较小通用公共许可证副本。如果没有,请参阅 <https://gnu.ac.cn/licenses/>。

项目详情


下载文件

下载您平台对应的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

bigfloat-0.4.0.tar.gz (258.2 kB 查看哈希值)

上传时间 源代码

由以下机构支持