これは、フロートの異なる精度間のキャストがどのように機能するかについての私の理解の誤りによるものだと確信していますが、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 ビットの float には 24 ビットの仮数があります。数値を正確に表すには 27 ビットが必要なため、最後の 3 ビットが切り捨てられます (ゼロに設定されます)。数字の最下位 3 ビットは011
2です。これらは000
2に設定されています。011
2が3
10であることを確認します。
Afloat32
の仮数精度は 24 ビットのみで、およそ 7 桁です (log10(2**24) = 7.22)。正確に 8 桁の数値を格納することを期待していますが、これは一般的に不可能です。