float64到float32转换会产生意外结果

时间:2014-05-20 22:25:43

标签: python numpy

当我将float64号码转换为float32号码时,我得到一个奇怪的结果:

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

为什么会这样?

1 个答案:

答案 0 :(得分:7)

20140131.0不能表示为32位整数。

32 bit float

64 bit float

对于浮动,在每个范围内,数字均匀分布。

所以它是(1 + M)* 2 ^(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之前你不会看到这个问题。

此外,数字舍入到最近的float的方式通常是以系统范围的方式定义的(我认为),但python的转换可能会过度统治,我并不完全熟悉它。