为何float32浮点数相等性检查可通过而float64会失败?
为什么float32的相等性检查能通过?
核心原因是float32的精度有限,两个原本在float64下有细微差异的值,被舍入到了同一个float32的二进制表示上。
先看float64的情况:0.0001和0.0003都无法用二进制浮点数精确表示。
np.float64(0.0003)是直接把十进制0.0003近似为最接近的float64值;而np.float64(0.0001 * 3)是先把0.0001近似为float64,再乘以3,得到的近似值和前者有极小差异(一个约为0.0002999999999999999889,另一个约为0.0003000000000000000333),所以x == y失败。再看float32的情况:float32只有24位有效二进制位数(含隐含位),对应十进制约6-7位有效数字。上述两个float64的差值远小于float32在0.0003这个数量级上的最小可分辨单位(即ulp,最后一位单位)。当把这两个float64值转成float32时,都会被舍入到同一个最接近的float32精确值——具体来说,这个值是
0.0003000000142492354(二进制表示下的精确float32值)。
不管是通过astype(np.float32)转换,还是直接用np.float32(0.0003)、np.float32(0.0001*3)初始化,最终得到的都是这个相同的float32值,所以相等性检查能通过。
内容的提问来源于stack exchange,提问作者Joseph
相关产品推荐
相关产品推荐

