任意精度的正确舍入浮点运算,通过mpfr。
bigfloat的Python项目详细描述
bigfloat包是一个提供任意精度的python包 正确舍入的二进制浮点运算。它是作为 Cython包装在GNU MPFR library周围。两行python代码应该给出 想法:
>>> from bigfloat import * >>> with precision(200) + RoundTowardZero: ... print(sqrt(2)) ... 1.4142135623730950488016887242096980785696718753769480731766796 >>> with quadruple_precision: ... const_pi() ... BigFloat.exact('3.14159265358979323846264338327950280', precision=113)
功能
- 支持Python2(2.6或更高版本)和Python3(3.2或更高版本)
- 准确的重复性,正确的四舍五入结果跨平台; 精确定义的语义与ieee 754-2008标准兼容。
- 支持使用Python整数和浮点数的混合类型操作
- 支持在任何IEEE二进制文件中模拟IEEE 754算法 IEEE754-2008中描述的交换格式无限,南斯, 支持有符号零和次正规。
- 通过Context对象轻松控制舍入模式和精度 以及python的with语句。
文件
完整的package documentation托管在 阅读文档。继续阅读,快速浏览。
快速游览
bigfloat包很小,使用起来很简单。这里有一个快速的 参观它的一些特点。
出于演示目的,请从:
>>> from bigfloat import *
注意,这个导入隐藏了四个内置的python函数,即 abs、max、min和pow。正常使用时 可能只想导入 真的需要。
主要类是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)
将precision(200)参数传递给BigFloat构造函数 上面也是Context的一个例子:
>>> precision(200) Context(precision=200)
可以使用^{tt16}设置用于计算的上下文$ 函数,但对上下文进行临时更改的更好方法 使用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对象也可以使用addition进行组合:
>>> with RoundTowardPositive + precision(24): ... BigFloat(1) / 3 ... BigFloat.exact('0.333333343', precision=24)
对应于ieee 754交换的各种Context对象 格式是预定义的:
>>> 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包是available on the Python package index,可以在通常的 方法使用easy_install或pip。或者,开发来源 可以从github上的项目homepage下载。
有关更全面的安装说明,请参见full documentation。
反馈
欢迎反馈!请使用GitHub issue tracker报告问题。 或者,你可以直接在dickinsm@gmail.com联系马克·迪金森。 提供建议、投诉、错误报告等。
许可证
Bigfloat软件包版权所有(c)2009–2014 Mark Dickinson
bigfloat包是免费软件:您可以重新分发和/或修改它 根据由 自由软件基金会,或者许可证的第3版,或者 选项)任何更高版本。
bigfloat包的发布是希望它会有用,但是 没有任何保证;甚至没有对适销性或 适合某一特定目的。参见GNU Lesser通用公共许可证 更多细节。
你应该收到GNU Lesser通用公共许可证的副本 以及bigfloat包如果没有,请参见<;http://www.gnu.org/licenses/>;。
链接
- {A10}
- {a11}
- {a12}
- Issue tracker