如何在python中将数字转换为12位精度?

时间:2017-11-30 12:39:00

标签: python types floating-point precision floating-accuracy

我需要在Python中存储一个12位精度的浮点变量

我知道要在float中转换变量,有一个浮点函数,但是如何以位为单位指定浮点数的大小?例如(12,16,......)

3 个答案:

答案 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个零字节。如果您只关心兼容性,这可能就足够了。

此精确度extended precision

  

在下表中,平台?意味着类型可能不是   适用于所有平台。与不同的C或Python的兼容性   指示类型:如果它们的数据属于,则两种类型是兼容的   相同的大小和解释方式相同。

另请阅读有关使用此类外来类型的警告

我觉得这很有启发性。我的结论是,如果你想绝对保证python精度,那么numpy不是正确的选择,因为可用扩展精度的固有歧义来自你的C分布中的歧义。鉴于您的物理背景,如果您想保证稳定性,我建议使用https://stackoverflow.com/a/18537604/4013571

在C ++中定义自己的类型

对于感兴趣的高级用户,可以定义自己的数据类型。 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