Python3中使用set时的浮点数比较规则是什么?
Python3
set 对浮点数的比较规则 - 使用
set处理存储浮点数的列表时,完全不会引入基于机器epsilon的容差相等校验,整个比较过程执行的是严格的位级相等判断。
原生
set结构本身不实现任何自定义的元素比较逻辑,去重流程完全依赖传入元素自身的内置方法:
- 计算待插入元素的哈希值,定位对应的存储桶位置
- 当桶内已存在和当前元素哈希值完全相等的元素时,才会触发两个元素的
==判断,决定是否将当前元素判定为重复项去重
- Python 内置
float类型的__eq__方法没有内置容差逻辑,只有当两个浮点数的二进制存储表示完全一致时,才会被判定为相等。哪怕两个值的数学差值远小于双精度浮点数的机器epsilon,只要位表示存在哪怕1比特的差异,就会被判定为不同的集合元素。 - 可复现的实际运行示例:
示例中两个值的实际差值约为5.55e-17,远小于双精度浮点数的机器epsilon(约2.22e-16),但因为位表示存在差异,依然会被xs = [0.1 + 0.2, 0.3] print(set(xs)) # 输出:{0.30000000000000004, 0.3}set识别为两个独立元素。 - 如果需要实现带指定容差的浮点数去重,需要自行封装比较逻辑,无法直接依赖原生
set的默认行为。
内容的提问来源于stack exchange,提问作者bzm3r
相关产品推荐
相关产品推荐

