float64 转 float32 时结果意外

7 投票
1 回答
3834 浏览
提问于 2025-04-18 07:08

当我把一个 float64 类型的数字转换成 float32 类型的数字时,结果变得很奇怪:

In [22]: np.float32(20140131.0)
Out[22]: 20140132.0

这是为什么呢?

1 个回答

9

20140131.0 这个数字不能用32位整数来表示。

32位浮点数

64位浮点数

在浮点数中,每个范围内的数字是均匀分布的。

所以它的计算方式是 (1+M) * 2^(E),其中 M 和 E 是一些参数。

20140131.0 这个数字在 2^24 到 2^25 的范围内。在这个范围内有 16,777,216 个数字,但只有 8,388,608 个可以表示为浮点数。所以你只能表示偶数。

因为在32位浮点数中,只有23位用于表示有效数字,所以整数只能表示到 2^24。超过这个值,epsilon > 1。这里的 epsilon 是两个相邻浮点数之间的差值。

至于 Python 的浮点数,我认为它们的工作方式是这样的:

Python中的浮点数通常不是32位或64位,所以这不是问题。它的长度会自动调整。但是如果你把它们转换为特定类型,就会看到精度不足的问题。对于64位整数,有52位用于有效数字,所以你不会在 2^53 之前遇到这个问题。

另外,数字四舍五入到最近的浮点数的方式通常是系统范围内定义的(我认为),但 Python 的转换可能会覆盖这个规则,我对此不是很熟悉。

撰写回答