You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Numpy dot乘积与手动矩阵乘法结果存差异,求原因

复数矩阵乘法结果差异的原因分析

问题重现

尝试对两个复数矩阵做乘法,分别用numpy.dot和手动计算实现,结果出现微小差异:

numpy实现代码

import numpy as np

a = [[0.8730616+0j, 0.8133501+0.3224322j], [0.8133501-0.3224322j, 0.87694746+0j]]
g = [[0.70813084+0j, 0.6563272+0.26035604j],[-0.6563272+0.26035604j, 0.70813084+0j]]

a_temp1 = np.dot(a, g)

手动计算代码

import numpy as np

a = [[0.8730616+0j, 0.8133501+0.3224322j], [0.8133501-0.3224322j, 0.87694746+0j]]
g = [[0.70813084+0j, 0.6563272+0.26035604j],[-0.6563272+0.26035604j, 0.70813084+0j]]

a_temp2 = np.zeros((2, 2))
a_temp2[0,0] = a[0,0]*g[0,0] + a[0,1]*g[1,0]
a_temp2[0,1] = a[0,0]*g[0,1] + a[0,1]*g[1,1]
a_temp2[1,0] = a[1,0]*g[0,0] + a[1,1]*g[1,0]
a_temp2[1,1] = a[1,0]*g[0,1] + a[1,1]*g[1,1]

结果差异示例

a_temp1[0,0] = 0.0004709065+0.00013959408j
a_temp2[0,0] = 0.0004708767+0.00013959408j

差异原因

  • 浮点数精度的固有局限:计算机用二进制浮点数存储实数,大部分十进制小数无法被精确表示,运算过程中会产生微小的舍入误差。复数的实部和虚部分别遵循这一规则,累加、乘法步骤的误差会逐步累积。
  • 运算实现的细节差异:numpy.dot依赖底层优化的线性代数库(如BLAS/LAPACK),这些库会采用更高效的运算顺序、寄存器优化或并行计算策略,与手动计算的逐元素累加顺序不同,导致最终舍入结果出现细微差别。
  • 数据处理逻辑的细微区别:手动计算时使用Python原生复数类型,而numpy.dot会先将列表转换为numpy复数数组(默认np.complex128),两种环境下中间结果的存储、运算逻辑细节存在差异,进一步放大了微小的精度误差。

内容的提问来源于stack exchange,提问作者Sumeer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 17:57:56