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

迭代与向量化正弦函数计算结果存在差异的问题排查

问题

处理包含纬度值的NetCDF文件时,尝试计算纬度正弦值的倒数,分别用遍历逐个计算和数组向量化运算两种方式实现,但两者倒数的差值不为零,寻求差异原因。

代码如下:

import xarray as xr
import numpy as np

data = xr.open_dataset('ERA5_2000_01_01.nc')
lat = data.latitude.values
omega = 7.292e-5

f1 = np.array([2 * omega * np.sin(x * np.pi / 180.0) for x in lat])
f2 = 2 * omega * np.sin(lat * np.pi / 180.0)

diff = 1/f1 - 1/f2
print(diff)

得到的差值diff为:

[-0.00018776 -0.00050296 -0.00059619 -0.00035761  0.00011444 -0.00065717
 -0.00024923 -0.00060329  0.00018545 -0.00014504 -0.00064833 -0.00043263
  0.00061779  0.00013936 -0.00046115 -0.00041766 -0.0009715   0.0005565
 -0.00034907 -0.00123883 -0.00013027  0.00075469  0.00162418 -0.00066007
 -0.00037552 -0.00189229 -0.00101494  0.00089398  0.00063323  0.00030524
  0.00051748  0.00012772  0.00051868  0.00344283 -0.002541    0.00145573
         nan -0.00145573  0.002541   -0.00344283 -0.00051868 -0.00012772
 -0.00051748 -0.00030524 -0.00063323 -0.00089398  0.00101494  0.00189229
  0.00037552  0.00066007 -0.00162418 -0.00075469  0.00013027  0.00123883
  0.00034907 -0.0005565   0.0009715   0.00041766  0.00046115 -0.00013936
 -0.00061779  0.00043263  0.00064833  0.00014504 -0.00018545  0.00060329
  0.00024923  0.00065717 -0.00011444  0.00035761  0.00059619  0.00050296
  0.00018776]
差异原因分析
  • 浮点数精度累积差异:遍历计算时,每个纬度值单独完成弧度转换、正弦计算后再存入数组;向量化运算则是numpy对整个数组执行批量优化计算。两种方式的浮点数运算顺序、内部精度处理细节不同,会产生微小的数值偏差。
  • 向量化运算的硬件优化:numpy向量化操作会利用CPU的SIMD指令集批量计算,这类优化可能调整运算顺序或舍入策略,和单个元素计算的精度表现略有不同,进而导致结果差异。
  • 小数值的放大效应:omega是7.292e-5的小数值,计算出的f1、f2本身数值极小,此时两者间的微小绝对差异,在取倒数后会被放大为可观测的差值;尤其是赤道附近纬度为0时,sin(0)=0,倒数会出现NaN,对应diff中的NaN值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 22:14:55