Chr*_*per 3 python floating-point numpy
我意识到 np.islcose() 函数可用于安全地检查浮点数是否相等。不过,目前让我感到困惑的是,使用标准 <= 运算符会得到不同的结果。例如:
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)
Run Code Online (Sandbox Code Playgroud)
给我
is close?
True
True
is less than or equals to?
True
False
Run Code Online (Sandbox Code Playgroud)
有没有人对此有明智的解决方法?我认为一种选择可能是为 numpy 浮点重载 python 比较运算符,并且(在该函数中)将两个浮点数四舍五入到小数点后第 8 位。但这是在速度有些重要的情况下,感觉有点麻烦。
在此先感谢您的帮助!
您可以定义多种功能结合在一起<,并>用isclose。
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)
Run Code Online (Sandbox Code Playgroud)
它们类似于<=和>=,但它们也用于np.isclose()测试相等性。
根据此Difference Between Python float and numpy float32np.float32 ,python 的看待方式和之间存在差异np.float64。value64如果您实际检查和的中间值value32,您将看到:
value32 = 0.5000000119209289
value64 = 0.5
Run Code Online (Sandbox Code Playgroud)
这解释了为什么print(value32 <= threshold)评估结果为 false。由于二进制错误,我怀疑四舍五入到小数点后第八位是否安全,就像value32您将拥有的那样0.50000001。
您还应该考虑到舍入数字所需的时间绝对很小,并且仍然必须在以下情况下使用
np.float64(0.1) + np.float64(0.2)
Run Code Online (Sandbox Code Playgroud)
因为它的计算结果为0.30000000000000004,因此使用 a>=或时会出现错误<=。如果您使用该库也会发生此错误decimal。简而言之,有些数字确实无法避免出现某种错误。据我所知,规避此问题的唯一方法是四舍五入。
我尝试测试了一堆带舍入和不带舍入的组合,速度太快了,我无法记录超过 10000 次迭代的时间差异,所以除非你要交易股票或训练神经网络数周,否则我认为不会对数字进行四舍五入是您需要担心的事情。
如果您担心将数字舍入到何处的任意性,我会在有效数字后面搜索一串0长于 4 的字符串,然后在那里将其截断。
| 归档时间: |
|
| 查看次数: |
1619 次 |
| 最近记录: |