Package: bigfloat
Thebigfloatpackage is a Python package providing arbitrary-precision
correctly-rounded binary floating-point arithmetic.  It is implemented as aCythonwrapper around theGNU MPFR library.  A couple of lines of Python code should give the
idea:>>> from bigfloat import *
>>> with precision(200) + RoundTowardZero:
...     print(sqrt(2))
...
1.4142135623730950488016887242096980785696718753769480731766796
>>> with quadruple_precision:
...     const_pi()
...
BigFloat.exact('3.14159265358979323846264338327950280', precision=113)FeaturesSupports Python 2 (version 2.7) and Python 3 (version 3.5 or later).Exactly reproducible correctly-rounded results across platforms;
precisely-defined semantics compatible with the IEEE 754-2008 standard.Support for mixed-type operations with Python integers and floats.Support for emulating IEEE 754 arithmetic in any of the IEEE binary
interchange formats described in IEEE 754-2008.  Infinities, NaNs,
signed zeros, and subnormals are all supported.Easy control of rounding modes and precisions viaContextobjects
and Python’swithstatement.DocumentationFullpackage documentationis hosted at
Read the Docs.  Read on for a quick tour.A quick tourThebigfloatpackage is small and simple to use.  Here’s a quick
tour of some of its features.For demonstration purposes, start with:>>> from bigfloat import *Note that this import shadows some builtin Python functions, namelyabs,max,min,pow,roundand (on Python 2 only)cmp.  In normal
usage you’ll probably only want to import the classes and functions that you
actually need.The main class is theBigFloatclass:>>> 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)Newly-createdBigFloatinstances refer to the currentcontextto
determine what precision and rounding modes to use.  This current
context is represented by aContextinstance, and can be retrieved
by callinggetcontext:>>> getcontext()
Context(precision=53, emax=1073741823, emin=-1073741823,
        subnormalize=False, rounding=ROUND_TIES_TO_EVEN)Theprecision(200)argument passed to theBigFloatconstructor
above is also an example of aContext:>>> precision(200)
Context(precision=200)The context used for a calculation can be set using thesetcontextfunction, but a better way to make a temporary change to the context
is to use Python’swithstatement:>>> with precision(1000):
...     print sqrt(2)
...
1.41421356237309504880168872420969807856967187537694807317667973
7990732478462107038850387534327641572735013846230912297024924836
0558507372126441214970999358314132226659275055927557999505011527
8206057147010955997160597027453459686201472851741864088919860955
232923048430871432145083976260362799525140798964Here,sqrtis one of a number of mathematical functions that thebigfloatpackage exports.  As you can see, these functions operate on
integers and floats as well asBigFloatinstances, but always
return aBigFloatinstance.Rounding modes can be controlled similarly.  Here are upper and lower
bounds for π, accurate to 53 significant bits:>>> with RoundTowardPositive:
...     const_pi()
...
BigFloat.exact('3.1415926535897936', precision=53)
>>> with RoundTowardNegative:
...     const_pi()
...
BigFloat.exact('3.1415926535897931', precision=53)And as you’d expect,withstatements like those above can be
nested.Contextobjects can also be combined using addition:>>> with RoundTowardPositive + precision(24):
...     BigFloat(1) / 3
...
BigFloat.exact('0.333333343', precision=24)VariousContextobjects corresponding to IEEE 754 interchange
formats are predefined:>>> 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)InstallationThebigfloatpackage isavailable on the Python package index, and can be installed in the usual
way usingeasy_installorpip.  Alternatively, the development sources
may be downloaded from the project’shomepageon GitHub.For more comprehensive installation instructions, please see thefull
documentation.FeedbackFeedback is welcome!  Please use theGitHub issue trackerto report issues.
Alternatively, you can contact Mark Dickinson directly atdickinsm@gmail.comwith suggestions, complaints, bug reports, etc.LicenseThe bigfloat package is copyright (C) 2009–2019 Mark DickinsonThe bigfloat package is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or (at your
option) any later version.The bigfloat package is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License
for more details.You should have received a copy of the GNU Lesser General Public License
along with the bigfloat package.  If not, see <http://www.gnu.org/licenses/>.LinksDocumentation at Read the DocsPython package indexProject homepage at GitHubIssue tracker