我有精度问题。我必须让我的c ++代码具有与matlab相同的精度。在matlab中,我有脚本,它用数字等做一些东西。我用c ++获得了与该脚本相同的代码。输出相同的输入是不同的:(我发现,在我的脚本,当我尝试104> = 104它返回false。我试图使用格式很长,但它并没有帮助我找出为什么它的错误。 double我认为也许matlab存储的地方真正的价值104和真正的103.9999 ...所以我在c ++中提高了我的精度,它也没有帮助,因为当matlab在c ++中返回值为50.000时,我得到了值50.050的高精度,这两个值来自少数计算,比如+或*。有什么办法可以让我的c ++和matlab脚本具有相同的精度?

for i = 1:neighbors

y = spoints(i,1)+origy;

x = spoints(i,2)+origx;

% Calculate floors, ceils and rounds for the x and y.

fy = floor(y); cy = ceil(y); ry = round(y);

fx = floor(x); cx = ceil(x); rx = round(x);

% Check if interpolation is needed.

if (abs(x - rx) < 1e-6) && (abs(y - ry) < 1e-6)

% Interpolation is not needed, use original datatypes

N = image(ry:ry+dy,rx:rx+dx);

D = N >= C;

else

% Interpolation needed, use double type images

ty = y - fy;

tx = x - fx;

% Calculate the interpolation weights.

w1 = (1 - tx) * (1 - ty);

w2 = tx * (1 - ty);

w3 = (1 - tx) * ty ;

w4 = tx * ty ;

%Compute interpolated pixel values

N = w1*d_image(fy:fy+dy,fx:fx+dx) + w2*d_image(fy:fy+dy,cx:cx+dx) + ...

w3*d_image(cy:cy+dy,fx:fx+dx) + w4*d_image(cy:cy+dy,cx:cx+dx);

D = N >= d_C;

end我在第12行遇到了其他问题。tx和ty eqauls 0.707106781186547或1 - 0.707106781186547。来自d_image的值在范围0和255之间.N是从图像内插4个像素的值0..255。 d_C是值0.255。仍然不知道为什么matlab显示,当我有N个vlaues,如:x x x 140.0000 140.0000和d_C:x x x 140 x。 D在第四位给我0,所以140.0000!= 140.我调试它试图更精确,但它仍然说它的140.00000000000000,它仍然不是140。

int Codes::Interpolation( Point_ point, Point_ center , Mat *mat)

{

int x = center.x-point.x;

int y = center.y-point.y;

Point_ my;

if(x<0)

{

if(y<0)

{

my.x=center.x+LEN;

my.y=center.y+LEN;

}

else

{

my.x=center.x+LEN;

my.y=center.y-LEN;

}

}

else

{

if(y<0)

{

my.x=center.x-LEN;

my.y=center.y+LEN;

}

else

{

my.x=center.x-LEN;

my.y=center.y-LEN;

}

}

int a=my.x;

int b=my.y;

double tx = my.x - a;

double ty = my.y - b;

double wage[4];

wage[0] = (1 - tx) * (1 - ty);

wage[1] = tx * (1 - ty);

wage[2] = (1 - tx) * ty ;

wage[3] = tx * ty ;

int values[4];

//wpisanie do tablicy 4 pixeli ktore wchodza do interpolacji

for(int i=0;i<4;i++)

{

int val = mat->at(Point_(a+help[i].x,a+help[i].y));

values[i]=val;

}

double moze = (wage[0]) * (values[0]) + (wage[1]) * (values[1]) + (wage[2]) * (values[2]) + (wage[3]) * (values[3]);

return moze;

}LEN = 0.707106781186547数组值中的值与matlab值100%相同。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐