以下代码
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
,远远超出最高float32
。 3.402823e38
可以给出确切的值。
int32
Emmm .....在阅读下面的评论后,我开始阅读更多有关int和float数字如何用二进制表示的内容。我没有说清楚。
也许有人可以谈论如何在更广泛的范围内获得浮点数的精度/分辨率,这对于理解原始Q的问题也很有用。
float64
答案 0 :(得分:1)
浮点值由两部分组成,整数和指数。要获得该值,您将2乘以指数的幂并将其乘以整数部分。
对于IEEE 32位浮点值,整数部分为only 24 bits long。通过用指数补偿可以获得更大的值,但前提是它们超过24的底部位都是零。
2147483647底部位没有零,但2147483648没有。