繁体   English   中英

python中精度浮点的损失

[英]Loss of precision float in python

我有一个叫做分数变化对数概率的列表。

当我调用此函数时:

maxState = scores.pop(scores.index(max(scores)))

并打印maxState ,我意识到maxState失去了作为浮点数的精度。 有没有办法我可以在不损失精度的情况下获得maxState?

例如:我打印出列表分数​​: [-35.7971525669589, -34.67875545008369]并打印maxState,我得到的是: -34.6787554501 (您可以看到它是四舍五入的)

您正在将字符串表示与实际内容混淆。 没有任何地方会丢失精度,只有为写入控制台而产生的字符串使用的是四舍五入的值,而不是显示所有数字。 始终记住,浮点数是数字近似值,而不是精确值。

使用str()repr()函数时,Python浮点的格式不同。 在列表或其他容器中,使用repr() ,但直接打印它并使用str()

如果您不喜欢任何一个选项,请使用format()函数并指定精度来明确格式化它:

print format(maxState, '.12f')

例如,以8位小数打印。

演示:

>>> maxState = -34.67875545008369
>>> repr(maxState)
'-34.67875545008369'
>>> str(maxState)
'-34.6787554501'
>>> format(maxState, '.8f')
'-34.67875545'
>>> format(maxState, '.12f')
'-34.678755450084'

repr()输出大致等效于使用'.17g'作为格式,而str()等效于'.12g' ; 这里的精度表示何时使用科学计数法( e )和何时以浮点计数法( f )显示。

我说大概是因为repr()输出的目的是让你圆trippable输出; 请参阅float()表示形式上的Python 3.1更改说明 ,该说明已反向移植到Python 2.7:

新功能是如何显示数字。 以前,Python使用一种简单的方法。 repr(1.1)的值计算为format(1.1, '.17g') ,其值为'1.1000000000000001' 使用17位数字的优点是它依靠IEEE-754保证来确保eval(repr(1.1))会精确地往返于其原始值。 缺点是许多人发现输出令人困惑(将二进制浮点表示的固有限制误认为是Python本身的问题)。

用于repr(1.1)的新算法更加智能,并返回'1.1' 有效地,它搜索所有等效的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM