将int32转换为其他类型时的精度

时间:2016-07-26 14:34:33

标签: python numpy floating-point precision type-conversion

以下代码

import numpy as np

i = np.iinfo(np.int32).max # 2147483647
x = np.asanyarray(i) # array([2147483647])
dtypes = (np.int32, np.float16, np.float32, np.float64)
for dtp in dtypes:
    print('%s : %s'%(dtp, x.astype(dtp)))

输出

<type 'numpy.int32'> : 2147483647
<type 'numpy.float16'> : inf
<type 'numpy.float32'> : 2147483648.0
<type 'numpy.float64'> : 2147483647.0

现在我们看到2147483648.0的{​​{1}}和numpy.float32的{​​{1}}。我用Google搜索并找到here

  

具有六个或更少有效十进制数的所有整数可以转换为IEEE 754浮点值而不会丢失精度,一些最多九个有效十进制数的整数可以转换为IEEE 754浮点值而不会损失精度,但不能存储超过九位有效十进制数字。例如,32位整数2,147,483,647以IEEE 754格式转换为2,147,483,650。

提到了另一个值2147483647.0

我不清楚这是怎么发生的。 numpy.float64有效期最高为2,147,483,650,远远超出最高float323.402823e38可以给出确切的值。

int32

Emmm .....在阅读下面的评论后,我开始阅读更多有关int和float数字如何用二进制表示的内容。我没有说清楚。

也许有人可以谈论如何在更广泛的范围内获得浮点数的精度/分辨率,这对于理解原始Q的问题也很有用。

float64

1 个答案:

答案 0 :(得分:1)

浮点值由两部分组成,整数和指数。要获得该值,您将2乘以指数的幂并将其乘以整数部分。

对于IEEE 32位浮点值,整数部分为only 24 bits long。通过用指数补偿可以获得更大的值,但前提是它们超过24的底部位都是零。

2147483647底部位没有零,但2147483648没有。