Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么np.float32会稍微更改矩阵中的值,而np.float64不会';T_Python_Numpy_Floating Point - Fatal编程技术网

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位有效数字(但可能是记错了)。