对于numpy浮点数,小于或等于运算符?

2024-05-21 04:25:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我意识到新罕布什尔群岛()函数可用于安全检查浮点数是否相等。不过,目前让我困惑的是,使用标准的<;=运算符会得到不同的结果。例如:

add_to = 0.05
value64 = np.float64(0.3) + add_to*4
value32 = np.float32(0.3) + add_to*4
threshold = 0.5
print('is close?')
print(np.isclose(value64, threshold))
print(np.isclose(value32, threshold))
print('is less than or equals to?')
print(value64 <= threshold)
print(value32 <= threshold)

给了我

^{pr2}$

有人对此有合理的解决办法吗?我认为一个选择可能是重载python比较运算符的numpy浮点,并且(在该函数中)将两个浮点取整到小数点后8位。但这是在一个速度有点重要的情况下,这感觉有点麻烦。在

提前感谢您的帮助!在


Tags: to函数addthresholdisnp运算符浮点
2条回答

根据这个Difference between Python float and numpy float32,python对np.float32和{}的看法是不同的。如果您实际检查value64value32的中间值,您将看到:

value32 = 0.5000000119209289
value64 = 0.5

这就解释了print(value32 <= threshold)计算结果为false的原因。由于二进制错误,我怀疑四舍五入到小数点后八位是否安全,就像value32一样,您将得到{}。在

您还应该考虑到,取整一个数字所需的时间绝对很小,而且仍然必须用于

^{pr2}$

因为它的计算结果是0.30000000000000004,因此在使用>=或{}时会出现错误。如果使用decimal库,也会发生此错误。简而言之,有些数字是你无法避免的。我所知道的绕过这一切的唯一办法就是绕圈。在

我试着用舍入和不舍入的方法测试了一堆组合,结果太快了,我无法记录10000次迭代的时间差,所以除非你交易股票或训练神经网络数周,否则你不需要担心舍入一个数字。在

如果您担心将数字舍入到何处的任意性,我会在一个有效数字后面搜索一个长度大于4的0字符串,然后在那里将其截断。在

您可以定义将<>与{}组合的函数。在

def approx_lte(x, y):
    return x <= y or np.isclose(x, y)
def approx_gte(x, y):
    return x => y or np.isclose(x, y)

它们类似于<=和{},只是它们也使用np.isclose()来测试相等性。在

相关问题 更多 >