c++ - 为什么 Matlab 给出的值与 C++ 不同

标签 c++ matlab floating-point precision

我正在用 C++ 创建一个用于计算机视觉的大型程序,为了调试目的,我使用 Matlab。经过一段时间的斗争,我意识到在使用 Matlab 和 c++(Visual studio 9 编译器 BTW)时,一些简单的算术方程式的答案是不同的。这是为什么?

这是算术运算:

Matlab函数:

function [x,y]=shape_fun(p,shape,Ax,Ay)

x=p(1)+Ax+shape(1)+Ax.*shape(3)+Ay.*shape(4)+Ax.*Ax.*shape(5)/2+Ay.*Ay.*shape(6)/2+Ax.*Ay.*shape(7);
y=p(2)+Ay+shape(2)+Ax.*shape(8)+Ay.*shape(9)+Ax.*Ax.*shape(10)/2+Ay.*Ay.*shape(11)/2+Ax.*Ay.*shape(12);

end

C++函数

cv::Point2d deformed(const double shape_fun[12],const cv::Point2d p,const double Ax,const double Ay){
    cv::Point2d result;

    result.x=(p.x+Ax)+shape_fun[0]+shape_fun[2]*Ax+shape_fun[3]*Ay+shape_fun[4]*Ax*Ax/2*shape_fun[5]*Ay*Ay/2+shape_fun[6]*Ax*Ay;
    result.y=(p.y+Ay)+shape_fun[1]+shape_fun[7]*Ax+shape_fun[8]*Ay+shape_fun[9]*Ax*Ax/2*shape_fun[10]*Ay*Ay/2+shape_fun[11]*Ax*Ay;
    return result;

}

数据:

注意:Matlab 值是从 debbuger c++ 值复制粘贴的,它们完全相同。

Ax=-12
Ay=-12
p=[468,683];
shape=[
     63.178114688537441
     36.536135487588474

    -0.038695673779030673
    -0.045313362559036965

     0.016469896824803026
     0.0017122284868442948
    -0.0030285669997117204

    -0.067902655024060773
     0.17995980761526389

     0.012716871878336870
    -0.036890386929202310
    -0.00081243692842574420
];

结果:

Matlab:

x =
     3.947029931219995e+02
y =
     7.043339656551383e+02

C++:

result  {x=393.54007007383439 y=703.64248713855773 }    cv::Point_<double>

注意:我并不是故意将问题标记为 OpenCV。虽然显然我在 C++ 中使用 OpenCV,但 cv::Point2d 只是一个具有两个 double 变量 x 和 y 的结构,我不根本不认为这个问题是关于 OpenCV 的。

最佳答案

result.x=
    (p.x+Ax)+
    shape_fun[0]+
    shape_fun[2]*Ax+
    shape_fun[3]*Ay+
    shape_fun[4]*Ax*Ax/2*
    shape_fun[5]*Ay*Ay/2+
    shape_fun[6]*Ax*Ay;
result.y=
    (p.y+Ay)+
    shape_fun[1]+
    shape_fun[7]*Ax+
    shape_fun[8]*Ay+
    shape_fun[9]*Ax*Ax/2*
    shape_fun[10]*Ay*Ay/2+
    shape_fun[11]*Ax*Ay;

应该(大概)

result.x=
    (p.x+Ax)+
    shape_fun[0]+
    shape_fun[2]*Ax+
    shape_fun[3]*Ay+
    shape_fun[4]*Ax*Ax/2+ /** change here **/
    shape_fun[5]*Ay*Ay/2+
    shape_fun[6]*Ax*Ay;
result.y=
    (p.y+Ay)+
    shape_fun[1]+
    shape_fun[7]*Ax+
    shape_fun[8]*Ay+
    shape_fun[9]*Ax*Ax/2+ /** change here **/
    shape_fun[10]*Ay*Ay/2+
    shape_fun[11]*Ax*Ay;

关于c++ - 为什么 Matlab 给出的值与 C++ 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15642240/

相关文章:

matlab - 如何在 MATLAB 中对矩阵的每一项应用条件并获得相同大小的输入矩阵并计算 1 的数量?

python - 浮点取模问题

PHP: number_format 四舍五入

matlab - ||在空矩阵的情况下,运算符必须可转换为逻辑标量值

将具有浮点顶点的段映射到二维整数空间(伪像素)的算法

c++ - Opencv 断言错误

c++ - QQuickView 内容未正确调整大小

c++ - 你能让一个类的方法不可继承吗?

c++ - 我的随机数生成器有什么问题?

model-view-controller - MATLAB 函数拒绝根据放置运行