我需要在Python中存储一个12位精度的浮点变量。
我知道将变量转换为浮点数有float函数,但是如何指定浮点数的比特大小呢?例如(12,16,...)
我需要在Python中存储一个12位精度的浮点变量。
我知道将变量转换为浮点数有float函数,但是如何指定浮点数的比特大小呢?例如(12,16,...)
如其他答案中所述,在纯Python数据类型中并不存在这个功能,请参阅文档。
但是,您可以使用numpy
来指定显式数据类型,例如:
numpy.float16
numpy.float32
numpy.float64
numpy.float96
的扩展精度,因为12个字节等于96位,这似乎是你想要的。import numpy as np
high_prec_array = np.array([1,2,3], dtype=np.float96)
正如评论和链接所指出的那样,这并不是真正的12字节精度。相反,它是80位(10字节),再加上2个零字节。如果您只关心兼容性,这可能已经足够了。
此精度可能在所有平台上都不可用
在下表中,platform? 表示该类型可能不适用于所有平台。与不同C或Python类型的兼容性是指:如果两种类型的数据大小相同且以相同的方式解释,则它们是兼容的。
还要阅读有关使用此类奇特类型的注意事项
Python
不是正确的选择,因为可用扩展精度中的固有模糊性来自于C分布中的模糊性。考虑到您的物理背景,我建议使用Fortran
以确保稳定性。numpy
指南user defined types states中提到:
如果你非常希望在作为添加数据类型能力的有用应用示例,是将任意精度浮点数的数据类型添加到NumPy。
python
中保留代码,那么你可以尝试使用boost/multiprecision/cpp_bin_float.hpp
。Python中的浮点类型是固定的。通常为64位,但它取决于实现。
你可以使用sys.float_info
来了解浮点数的大小,但你不能改变它。
https://docs.python.org/3/library/sys.html#sys.float_info
编辑:
如果你真的需要指定浮点数的大小,你可以依赖外部库,比如numpy。详见Alexander McFarlane的非常详细的回答。
float
使用C的double
,并且假设sizeof(double)== 8
被纳入了CPython源代码中。 (这很糟糕,但实际上似乎到目前为止没有引起任何真正的问题。)而IronPython和Jython则运行在(.NET和Java)平台上,这些平台明确说明Double是IEEE 754二进制64。MicroPython可能会做一些有趣的事情,但我不知道。 - Mark Dickinsongmpy2
的开发版本支持 96 位 IEEE 数字类型。
>>> import gmpy2
>>> gmpy2.version()
'2.1.0a1'
>>> gmpy2.set_context(gmpy2.ieee(96))
>>> gmpy2.get_context()
context(precision=83, real_prec=Default, imag_prec=Default,
round=RoundToNearest, real_round=Default, imag_round=Default,
emax=4096, emin=-4175,
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,
allow_complex=False,
rational_division=False)
>>> gmpy2.mpfr(1)/7
mpfr('0.14285714285714285714285714',83)
>>>
在旧版本的gmpy2
中也是可能的,但需要更多的努力。
>>> import gmpy2
>>> gmpy2.version()
'2.0.8'
>>> ieee96 = gmpy2.context(precision=83, emax=4096, emin=-4175, subnormalize=True)
>>> gmpy2.set_context(ieee96)
>>> gmpy2.mpfr(1)/7
mpfr('0.14285714285714285714285714',83)
>>>
您可能需要向下滚动以直接从 https://github.com/aleaxit/gmpy 下载源代码。一些早期的 wheel 文件可在 https://pypi.python.org/pypi/gmpy2/2.1.0a1 上获得。
免责声明:我维护 gmpy2
。