gpt4 book ai didi

python - 为什么 x <= x 是假的?

转载 作者:行者123 更新时间:2023-11-28 21:40:29 24 4
gpt4 key购买 nike

标题有点误导,因为不完全是x和x,是x和0.3;但是,值应该相同。

我有:

arr = np.arange(0, 1.1, 0.1)

我收到:

arr[arr <= 0.3]
> array([0., 0.1, 0.2])

正确的结果应该是:

arr[arr <= 0.3]
> array([0., 0.1, 0.2, 0.3])

我还没有偶然发现这个问题。我知道它与浮点精度有关......但我能在这里做什么?

最佳答案

不要依靠比较 float 来获得相等性(除非您确切地知道您正在处理的是什么 float )。由于您知道用于生成数组的步长为 0.1,

arr = np.arange(0, 1.1, 0.1)

您可以将阈值 0.3 增加一半的步长,以找到一个安全地位于 arr 值之间的新阈值:

In [48]: stepsize = 0.1; arr[arr < 0.3+(stepsize/2)]
Out[48]: array([ 0. , 0.1, 0.2, 0.3])

顺便说一句,np.arange(0, 1.1, 0.1) 中的 1.1 是同一想法的应用——考虑到 float 的变幻莫测算术上,如果我们编写 np.arange(0, 1.0, 0.1),我们无法确定 1.0 是否会被包含在内,因此右端点增加了步长.


从根本上说,问题归结为 floating-point arithmetic being inaccurate :

In [17]: 0.1+0.2 == 0.3
Out[17]: False

所以数组中的第四个值比 0.3 稍微大一点。

In [40]: arr = np.arange(0,1.1, 0.1)
In [41]: arr[3]
Out[41]: 0.30000000000000004

请注意,舍入可能不是一个可行的解决方案。例如,如果 arr 的数据类型为 float128:

In [53]: arr = np.arange(0, 1.1, 0.1, dtype='float128')

In [56]: arr[arr.round(1) <= 0.3]
Out[56]: array([ 0.0, 0.1, 0.2], dtype=float128)

虽然使 dtype float128 使 arr[3] 更接近小数 0.3,

In [54]: arr[3]
Out[54]: 0.30000000000000001665

现在四舍五入不会产生小于 0.3 的数字:

In [55]: arr.round(1)[3]
Out[55]: 0.30000000000000000001

关于python - 为什么 x <= x 是假的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45565620/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com