通过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 函数,即 abs、max、min、pow、round 以及仅在 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_install 或 pip 以通常方式安装。或者,可以从 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/>。
链接
项目详情
大float-0.4.0.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 58b96bde872aca5989d13d82eba3acf2aa1b94e22117dd72a16ba5911b0c0cb8 |
|
MD5 | d0bcbd4cbb5ee09b717fab02b3541cca |
|
BLAKE2b-256 | e06c34784aecbd34d8eaad938106a8b0e5af57dc7282baf613cb8414ef949c20 |