当我转换一个float64
数到一个float32
我得到一个奇怪的结果:
In [22]: np.float32(20140131.0)
Out[22]: 20140132.0
为什么会发生这种情况?
20140131.0 无法表示为 32 位整数。
32位浮点数 http://en.wikipedia.org/wiki/Single_precision
64 位浮点数 http://en.wikipedia.org/wiki/Double_precision
对于浮点数,在每个范围内,数字是均匀分布的。
所以它是 (1+M) * 2^(E)
所以 20140131.0 的范围是 2^24 到 2^25。该范围内有 16,777,216 个数字,但只有 8,388,608 个可表示的浮点数。所以只能表示偶数。
由于在 32 位浮点数中,尾数只有 23 位,因此整数最多只能表示 2^24。在此之上,epsilon > 1
. Where epsilon
是两个相邻浮点数之间的差。
至于Python浮点数,我相信它们的工作原理是这样的:
Python 中的浮点数通常不是 32 位或 64 位,因此这不是问题。长度自动调整。购买时,您将它们转换为特定类型,因此您会看到缺乏分辨率。对于 64 位整数,尾数有 52 位,因此直到超过 2^53 时才会看到此问题。
另外,数字四舍五入到最接近浮点数的方式通常是以系统范围的方式定义的(我认为),但Python的转换可能会推翻这一点,我并不完全熟悉它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)