我需要在Python中存储一个12位精度的浮点变量
我知道要在float中转换变量,有一个浮点函数,但是如何以位为单位指定浮点数的大小?例如(12,16,......)
答案 0 :(得分:7)
正如其他答案中所提到的,这并不存在 在纯python数据类型中,see the docs
但是,您可以使用numpy
指定显式data types,例如
numpy.float16
numpy.float32
numpy.float64
你也可以使用numpy.float96
import numpy as np
high_prec_array = np.array([1,2,3], dtype=np.float96)
,这似乎是你所追求的,因为12个字节是96位,例如
96bit
正如评论和链接中指出的那样,这不是真正的12字节精确度。相反,80位(10字节)填充2个零字节。如果您只关心兼容性,这可能就足够了。
在下表中,平台?意味着类型可能不是 适用于所有平台。与不同的C或Python的兼容性 指示类型:如果它们的数据属于,则两种类型是兼容的 相同的大小和解释方式相同。
另请阅读有关使用此类外来类型的警告
我觉得这很有启发性。我的结论是,如果你想绝对保证python
精度,那么numpy
不是正确的选择,因为可用扩展精度的固有歧义来自你的C分布中的歧义。鉴于您的物理背景,如果您想保证稳定性,我建议使用https://stackoverflow.com/a/18537604/4013571。
对于感兴趣的高级用户,可以定义自己的数据类型。 Fortran
python
指南
作为我认为有用的能力应用的一个例子 添加数据类型是添加数据类型的可能性 任意精度浮动到NumPy。
如果您热切希望将代码保存在static
{
Security.addProvider(new BouncyCastleProvider());
}
中,则可以尝试使用user defined types states。
答案 1 :(得分:2)
python中的float类型是固定的。通常为64位,但它依赖于实现。
您可以使用sys.float_info
知道浮动的大小,但您不应该更改它。
https://docs.python.org/3/library/sys.html#sys.float_info
编辑:
如果确实需要指定float大小,可以依赖外部库,例如numpy。有关详细信息,请参阅内容丰富的answer of Alexander McFarlane
答案 2 :(得分:1)
gmpy2
的开发版支持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下载源代码。 https://pypi.python.org/pypi/gmpy2/2.1.0a1可以使用一些非常早期的轮子。
免责声明:我保留gmpy2
。