如何从 [0., 1e-8] 的 argmax 获得结果?

发布于 2025-01-12 12:31:56 字数 207 浏览 1 评论 0原文

当我运行下面的代码时,我得到 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

玉环 2025-01-19 12:31:56

1e-8 转换为 float32 时,结果是 float32 可表示的最接近的数字,即 9.99999993922529029077850282192230224609375e-09,约为1.34•2−27

因此,在实数运算中,1 和 9.99999993922529029077850282192230224609375e-09 的和约为 1 + 1.34•2−27float32 中最接近的两个数字是 1 和 1+2−23。在这两者中,1 更接近 1 + 1.34•2−27,因此 float32 加法会产生 1。因此,a+1 的元素是 1 和 1。两者都是最大值的并列候选者,argmax 返回第一个元素的索引。

When 1e-8 is converted to float32, the result is the nearest number representable in float32, 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, so float32 addition produces 1 as a result. Thus, the elements of a+1 are 1 and 1. Both are tied candidates for the maximum, and argmax returns the index of the first one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文