gpt4 book ai didi

python - 为什么单精度和 double 比较在 numpy 中失败?

转载 作者:行者123 更新时间:2023-12-01 07:13:49 25 4
gpt4 key购买 nike

给定:

val = 1e20
a = np.array(val); b = np.array(val, 'f4')

我不明白为什么 a == b 为 False 而 np.allclose(a, b) 为 True。毕竟单精度 float 的范围是~10^38。事实上,由于 np.can_cast(1e20, 'f4') 为 True,我希望上面的等式应该有效。

我想这可能与 float 表示中的怪异有关,但我不完全理解内部到底发生了什么。

最佳答案

原因确实是二进制的浮点表示:

In [41]: print('{}'.format(a))
1e+20

In [42]: print('{}'.format(b))
1.00000002004e+20

原因是在 64 位中 a 是:

0100 0100 0001 0101 1010 1111 0001 1101 0111 1000 1011 0101 1000 1100 01000000

符号位为0,然后是11位指数100 0100 0001,其余为尾数。将其转换为 32 位并返回以进行比较,以去除尾数的最后一位:

0100 0100 0001 0101 1010 1111 0001 1101 1000 0000 0000 0000 0000 0000 00000000

因此,比较 float 可能会产生误导,因为 == 运算符会检查确切的二进制等价性。根据您的意图,您可以考虑检查协议(protocol)的级别,例如:

if fabs(a-b) < 1E-6: 
print('equal')

关于python - 为什么单精度和 double 比较在 numpy 中失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58087278/

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