我确信这是因为我对如何在不同的浮点精度之间进行投射的理解失效,但是有人可以解释为什么在32比64比特表示中,该值被转换为低于其真实值的3?
>>> a = np.array([83734315])
>>> a.astype('f')
array([ 83734312.], dtype=float32)
>>> a.astype('float64')
array([ 83734315.])
答案 0 :(得分:4)
32-bit float可以精确地代表尾数的大约7位小数。您的号码需要更多,因此无法准确表示。
发生的事情的机制如下:
32位浮点数具有24位尾数。您的数字需要精确表示27位,因此最后三位被截断(设置为零)。您的号码的三个最低位是011
2 ;这些设置为000
2 。注意011
2 是3
10 。
答案 1 :(得分:3)
float32
只有24位有效位精度,大约是7位数(log10(2 ** 24)= 7.22)。您希望它能准确存储一个8位数字,这通常是不可能的。