如何从 [0., 1e-8] 的 argmax 获得结果?
当我运行下面的代码时,我得到 x=1, y=0
a = np.array([0., 1e-8]).astype('float32')
x = a.argmax()
y = (a+1).argmax()
我已经知道浮点表达式。但是,我不知道为什么我可以得到 x=1, y=0。
我认为溢出或下溢可能与结果有关。 请帮忙解释一下!
When I ran below code, I got x=1, y=0
a = np.array([0., 1e-8]).astype('float32')
x = a.argmax()
y = (a+1).argmax()
I already know floating point expression. But, I don't know why I can get x=1, y=0.
I think that overflow or underflow can be related to the results.
Please help to explain!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当
1e-8
转换为float32
时,结果是float32
可表示的最接近的数字,即 9.99999993922529029077850282192230224609375e-09,约为1.34•2−27。因此,在实数运算中,1 和 9.99999993922529029077850282192230224609375e-09 的和约为 1 + 1.34•2−27。
float32
中最接近的两个数字是 1 和 1+2−23。在这两者中,1 更接近 1 + 1.34•2−27,因此float32
加法会产生 1。因此,a+1
的元素是 1 和 1。两者都是最大值的并列候选者,argmax
返回第一个元素的索引。When
1e-8
is converted tofloat32
, the result is the nearest number representable infloat32
, which is 9.99999993922529029077850282192230224609375e-09, which is about 1.34•2−27.So, in real-number arithmetic, the sum of 1 and 9.99999993922529029077850282192230224609375e-09 is about 1 + 1.34•2−27. The two numbers representable in
float32
that are closest to that are 1 and 1+2−23. Of those two, 1 is closer to 1 + 1.34•2−27, sofloat32
addition produces 1 as a result. Thus, the elements ofa+1
are 1 and 1. Both are tied candidates for the maximum, andargmax
returns the index of the first one.