我确信这是由于我对浮点数的不同精度之间的转换如何工作的理解上的失误,但是有人可以解释为什么在 32 位和 64 位表示中该值比其真实值小 3 吗?
>>> a = np.array([83734315])
>>> a.astype('f')
array([ 83734312.], dtype=float32)
>>> a.astype('float64')
array([ 83734315.])
我确信这是由于我对浮点数的不同精度之间的转换如何工作的理解上的失误,但是有人可以解释为什么在 32 位和 64 位表示中该值比其真实值小 3 吗?
>>> a = np.array([83734315])
>>> a.astype('f')
array([ 83734312.], dtype=float32)
>>> a.astype('float64')
array([ 83734315.])
一个32 位浮点数可以精确地表示大约 7 个十进制数字的尾数。您的数字需要更多,因此无法准确表示。
发生的机制如下:
32 位浮点数具有 24 位尾数。您的数字需要准确表示 27 位,因此最后三位被截断(设置为零)。您的数字的最低三位是011
2;这些设置为000
2。观察011
2是3
10。
Afloat32
只有 24 位的有效数字精度,大约是七位数 (log10(2**24) = 7.22)。您期望它准确地存储一个 8 位数字,这通常是不可能的。