Python 为什么np.float32会稍微更改矩阵中的值,而np.float64不会';T
当我将矩阵中的数字转换为Python 为什么np.float32会稍微更改矩阵中的值,而np.float64不会';T,python,numpy,floating-point,Python,Numpy,Floating Point,当我将矩阵中的数字转换为np.float32时,值会稍微修改: In [1]: matrix_32 = np.asarray([ ...: [0.7, 3], ...: [1.7, 2], ...: [0.7, 9] ...: ], dtype=np.float32) In [2]: matrix_32 Out[2]: array([[ 0.69999999, 3. ], [ 1.70000005, 2.
np.float32
时,值会稍微修改:
In [1]: matrix_32 = np.asarray([
...: [0.7, 3],
...: [1.7, 2],
...: [0.7, 9]
...: ], dtype=np.float32)
In [2]: matrix_32
Out[2]:
array([[ 0.69999999, 3. ],
[ 1.70000005, 2. ],
[ 0.69999999, 9. ]], dtype=float32)
但是,当我将数字转换为np.float64
时,值显示为预期值:
In [3]: matrix_64 = np.asarray([
...: [0.7, 3],
...: [1.7, 2],
...: [0.7, 9]
...: ], dtype=np.float64)
In [4]: matrix_64
Out[4]:
array([[ 0.7, 3. ],
[ 1.7, 2. ],
[ 0.7, 9. ]])
有人能解释为什么会发生这种情况吗?当十进制数转换为二进制浮点时,它们必须舍入为二进制分数,而不是十进制数。此舍入将更改值。对于float32,更改足够大,可以在Numpy使用的输出格式中看到。对于float64,更改太小,无法看到 显示的Numpy示例似乎使用了八位十进制数字或九位有效数字。对于正常的float32值,从十进制转换引起的更改往往是转换值的.0000000 3倍左右(并且是转换值的两倍),因此它们在九个有效数字中可见。对于正常的float64值,由十进制转换引起的变化往往约为.000000000000000 1(10−16) 乘以该值,因此它们太小,无法在九个有效数字中显示
对于正常float32值,变化可能大至16777216中的1部分。对于正常的float64值,变化可能大至9007199254740992中的1部分。这只是从十进制到二进制浮点的初始转换。进行算术运算(精确的数学结果被四舍五入为适合浮点格式的值)以及将数字转换回十进制显示时,可能会有其他四舍五入。(在正常范围之外,非常大的数字可能会溢出到无穷大[因此变化是无限的],非常小的数字会更粗略地舍入[对于最小的数字,甚至舍入到零,因此变化高达100%。)我建议您阅读一些浮点运算的介绍,例如,问题不仅仅在于介绍的不精确性,但另一个事实是,
np.float32
和np.float64
似乎对它们的对象有不同的\uuuuuuuurepr\uuuuuuuuuu
实现。我知道我们有很多浮点问题,这些问题很容易通过了解一些基本的浮点属性来回答,但将问题标记为重复问题应该意味着它们是完全重复的。它不应该被用来在没有提供答案的情况下转移广泛类别的问题。这个问题不是重复的。为了记录在案,与此相关的是NumPy的输出,而不是Python的输出。NumPy有自己的float32
和float64
类型,它们有自己的字符串表示,独立于Python内置的float
类型。在打印阵列时,NumPy以固定精度旋转;我认为默认情况下是8位有效数字(但可能是记错了)。