python中的精度浮点损失
我有一个叫做“变化对数概率分数”的列表 当我调用此函数时:python中的精度浮点损失,python,Python,我有一个叫做“变化对数概率分数”的列表 当我调用此函数时: maxState = scores.pop(scores.index(max(scores))) 打印maxState,我意识到maxState会失去其浮点精度。有没有一种方法可以在不损失精度的情况下获取maxState 例如:我打印出列表分数:[-35.7971525669589,-34.67875545008369] 然后打印maxState,我得到这个:-34.6787554501 (您可以看到它是四舍五入的)您将字符串表示与实
maxState = scores.pop(scores.index(max(scores)))
打印maxState
,我意识到maxState
会失去其浮点精度。有没有一种方法可以在不损失精度的情况下获取maxState
例如:我打印出列表分数:[-35.7971525669589,-34.67875545008369]
然后打印maxState,我得到这个:-34.6787554501
(您可以看到它是四舍五入的)您将字符串表示与实际内容混淆了。精度没有损失,只有写入控制台的字符串使用舍入值,而不是显示所有数字。永远记住,浮点数是数字近似值,而不是精确值 使用
str()
和repr()
函数时,Python浮点数的格式不同;在列表或其他容器中,使用了repr()
,但直接打印并使用str()
如果您不喜欢这两个选项中的任何一个,请使用并指定精度显式设置其格式:
print format(maxState, '.12f')
例如,用8位小数打印
演示:
repr()
输出大致相当于使用'.17g'
作为格式,而str()
相当于'.12g'
;这里的精度表示何时使用科学符号(e
)以及何时以浮点符号(f
)显示
我之所以这样说是因为repr()
输出的目的是为您提供四舍五入的trippable输出;请参阅,其中后端口为Python 2.7:
新的是数字的显示方式。以前,Python使用一种简单的方法。repr(1.1)
的值被计算为格式(1.1,.17g')
,计算结果为'1.10000000000001'
。使用17位数字的优势在于,它依赖IEEE-754保证,以确保eval(repr(1.1))
将精确往返到其原始值。缺点是许多人发现输出令人困惑(误认为二进制浮点表示的固有限制是Python本身的问题)
repr(1.1)
的新算法更智能,返回'1.1'
。实际上,它搜索所有等价的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式
您将字符串表示与实际内容混淆。精度没有损失,只有写入控制台的字符串使用舍入值,而不是显示所有数字。永远记住,浮点数是数字近似值,而不是精确值 使用
str()
和repr()
函数时,Python浮点数的格式不同;在列表或其他容器中,使用了repr()
,但直接打印并使用str()
如果您不喜欢这两个选项中的任何一个,请使用并指定精度显式设置其格式:
print format(maxState, '.12f')
例如,用8位小数打印
演示:
repr()
输出大致相当于使用'.17g'
作为格式,而str()
相当于'.12g'
;这里的精度表示何时使用科学符号(e
)以及何时以浮点符号(f
)显示
我之所以这样说是因为repr()
输出的目的是为您提供四舍五入的trippable输出;请参阅,其中后端口为Python 2.7:
新的是数字的显示方式。以前,Python使用一种简单的方法。repr(1.1)
的值被计算为格式(1.1,.17g')
,计算结果为'1.10000000000001'
。使用17位数字的优势在于,它依赖IEEE-754保证,以确保eval(repr(1.1))
将精确往返到其原始值。缺点是许多人发现输出令人困惑(误认为二进制浮点表示的固有限制是Python本身的问题)
repr(1.1)
的新算法更智能,返回'1.1'
。实际上,它搜索所有等价的字符串表示形式(使用相同的基础浮点值存储的字符串表示形式),并返回最短的表示形式
@弗拉夫:把浮点值放在一个容器中,复制起来很简单。是的,我忘了实际使用“print”@弗拉夫:把浮点值放在一个容器中,复制起来很简单。是的,我忘了在你的
浮点符号(f)
中实际使用“print”小注释。在文档中定义为固定点:固定点。将数字显示为定点数字。默认精度为6
。请参阅:浮点表示法(f)
的次要注释。在文档中定义为固定点:固定点。将数字显示为定点数字。默认精度为6
。见: