我对 python 中浮点数的精度和相等性检查有点困惑。
例如,
15 + 1e-16 == 15
计算出正确的 b/c 1e-16 是 < machine epsilon for fp64.
和
15 + 1e-15 == 15
评估为 false,因为 1e-15 > fp64 的机器 epsilon。
但是当我这样做
sys.getsizeof(15 + 1e-16)
时,我得到 24 个字节,即 fp192,如果它是 true,则意味着 15 + 1e-16 == 15
将评估为 false,因为 fp192 的机器 epsilon 肯定是 << 1e-16.
我一直认为
==
正在检查 LHS 是否在相应类型的机器 epsilon 的 +/-
范围内。
为了增加我的困惑,我检查了:
1e-323 == 0 # evaluates false
1e-324 == 0 # evaluates true
sys.getsizeof(1e-323) # gives 24 bytes
我不明白这方面的界限。
Python 中所有数字类型(包括浮点数)的比较都是精确的。硬件精度与此无关。
getsizeof()
返回 Python object 的大小,其中包括指向对象类型对象的指针的字节数以及引用计数等内容。在当前几乎所有的机器上,一个 float 的实际数据占用 8 个字节,只是其中的一小部分。