我如何能使matlab精度是相同的,在c++
How i can make matlab precision to be the same as in c++?
我有精度问题。我必须使我的c++代码具有与matlab相同的精度。在matlab中,我有脚本做一些东西与数字等。我用c++写的代码和那个脚本一样。相同输入上的输出是不同的:(我发现在我的脚本中,当我尝试104>= 104时,它返回false。我尝试使用格式长,但它并没有帮助我找出为什么它是假的。这两个数都是双精度数。我想也许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
在else中有问题,在第12行。Tx和ty等于0.707106781186547或1 - 0.707106781186547。d_image的取值范围是0到255。N的值为0…从图像插值4个像素的255。d_C值为0.255。仍然不知道为什么matlab显示当我在N中有:x x x 140.0000 140.0000和在d_C中:x x x 140 x. D在第4位给我0所以140.0000 != 140。我调试了它,尝试更精确,但它仍然显示它是140.00000000000000,它仍然不是140。
int Codes::Interpolation( Point_<int> point, Point_<int> center , Mat *mat)
{
int x = center.x-point.x;
int y = center.y-point.y;
Point_<double> 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<uchar>(Point_<int>(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%相同
Matlab使用双精度。你可以使用c++的double类型。这应该使大多数东西相似,但不是100%。正如其他人所说,这可能不是你问题的根源。要么是算法不同,要么是Matlab和c++中定义不同的库函数。例如,Matlab的std()除以(n-1),您的代码可以除以n。
首先,根据经验,直接比较浮点变量从来都不是一个好主意。而不是,例如,如果(nr >= 104)
,你应该使用如果(nr >= 104-e)
,其中e是一个小数字,如0.00001
。
但是,脚本中一定存在严重的欠采样或舍入错误,因为获得50050而不是50000不在常见浮点不精度的限制范围内。例如,Matlab的步长可以小到15位!
我猜你的代码中有一些类型转换问题,例如
int i;
double d;
// ...
d = i/3 * d;
将给出一个非常不准确的结果,因为您使用的是整数除法。d = (double)i/3 * d
或d = i/3. * d
会给出更准确的结果。
上面的例子在Matlab中不会引起任何问题,因为在默认情况下,所有东西都已经是浮点数了,所以在c++和Matlab代码的结果差异背后可能存在类似的问题。
看到你的计算将有助于找到错误的地方。
编辑:在c和c++中,如果将双精度数与相同值的整数进行比较,它们很有可能不相等。对于两个double也是一样的,但是如果你对它们执行完全相同的计算,你可能会很幸运。即使在Matlab中,这也很危险,也许你很幸运,因为它们都是双精度,它们都以同样的方式被截断。你最近的编辑似乎,问题是你在哪里评估你的数组。在c++中(或在任何使用浮点变量的语言中)比较浮点数或双精度数时,不应该使用==或!=。进行比较的正确方法是检查它们是否在彼此的小距离内。
一个例子:使用==或!=来比较两个双精度数,就像通过计算两个物体的原子数来比较它们的重量,即使它们之间有一个原子的差异,也决定它们不相等。
除非另有说明,否则MATLAB使用双精度。您在c++中看到的相同实现的任何差异都是由于浮点错误造成的。
- C++程序在将 int 与 cin 一起使用时有效,但不能使用字符串
- 不能使这种类型的"void(C::* volatile)(int) const "在参考手册C++示
- C++:不能使运算符<<成为模板嵌套类的好友
- 为什么我不能使私人运营商成为新的并使用默认实现?
- 有没有办法使成员函数不能从构造函数调用
- 不能使外部类成为内部类内的成员对象
- 为什么我不能使对象 m1
- 不能使布尔函数 C++
- 不能使C++程序使用足够高的精度
- PImpl 并不能使我免于导出 STL
- 为什么我不能使这个成员函数成为另一个类的好友?
- 不能使自定义 ctypedef 类的 cython 向量公开
- 是否可以从模板基类继承,但不能使派生类也成为模板
- 为什么我不能使类内初始化的"const const std::string"成为静态成员
- gcc能使我的代码并行吗
- 我如何能使matlab精度是相同的,在c++
- 我没能使enum正常工作
- 你能使一个类的方法不可继承吗?
- C++11编译器何时会使RVO和NRVO优于移动语义和常量引用绑定
- 我怎么能使循环和改变number为字符串