Python / C++ - 精度差异

kir*_*off 0 c++ python precision scientific-computing

优化后,我使用 Python 和 C++ 中的最佳参数计算残差。结果差距巨大。以下是我更准确地进行操作的方法:

我根据 Python 中的参数模型生成数据。我将 X 和 Y 存储在 Excel 文件中。我将此文件加载到我的 C++ 程序中并运行优化。我提出了最佳参数,它们与用于生成该系列的参数非常接近。然后,我使用 Python 和 C++ 计算残差(Y 与具有最佳参数的模型输出之间的平方差之和)。结果是巨大的,对于对参数变化非常敏感的模型,差异高达 10^3。这些差异是否可以归因于 Python 和 C++ 中处理精度的不同方式,或者是否还有其他问题?优化完成后,残差计算就是一个简单的计算,我想知道如果不是精度问题,问题可能出在哪里。

非常感谢您的任何建议或参考。

编辑 --- 我可以轻松地显示用于生成数据和计算残差平方和的 Python 代码,但不能显示 C++ 代码,因为计算是通过解释器执行的。感谢您的任何评论。

P1 =  5.21
P2 = 0.22

X_= list(range(0,100,1))
X=[float(x)/float(10) for x in X_]
Y = [P1*numpy.exp(-1*P2*x) for x in X]

##plt.plot(X,Y)
##plt.show()

##for j in range(len(Y)):
##    Y[j]+=rg.normal(0,0.01)

#build some input files
X1f = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1X.txt', 'w')
for i in range(len(X)):
     X1f.write(str(X[i])+'\n')
X1f.close()

Yf = open('F:\WORK\SOLVEUR\ALGOCODE\PYTHON_\DataSets\exponential1Y.txt', 'w')
for i in range(len(Y)):
    Yf.write(str(Y[i])+'\n')
Yf.close()


def func_exp_1(param, x1, y):
   p1, p2 = param
   res = sum((y_i - p1*numpy.exp(-1*p2*x))**2 for x1_i, y_i in zip(x1, y))
   return res
print func_exp_1([5.2132,0.2202],x1,y)
Run Code Online (Sandbox Code Playgroud)

Jam*_*nze 5

Python和C++都使用机器本机格式;Pythonfloat相当于 C++ 的double. 任何差异都可能是由于算法实现方式的差异, 或者,如果硬件具有用于中间值的扩展格式(英特尔的情况),则语言将值存储回内存的时间和位置 - 值在 Python 中可能比在 C++ 中更频繁地存储到内存中。如果没有看到确切的代码,就不可能说更多(但是大量元素的总和可能会显着偏离,具体取决于元素的顺序和相对大小)。