一个简单的浮动cv :: Mat就像这样
cv::Mat _1 = (cv::Mat_<float>(5, 5) << 1, 4, 6, 4, 1, 4, 16, 24, 16, 4, 6, 24, 36, 24, 6, 4, 16, 24, 16, 4, 1, 4, 6, 4, 1);
使用cv::pow(_1,2,_1)
[1, 16, 36, 16, 1;
16, 256, 576, 256, 16;
36, 576, 1296, 576, 36;
16, 256, 576, 256, 16;
1, 16, 36, 16, 1]
没关系,但使用cv::cuda::pow(_1,2,_1)
时输出为
[1, 16, 35.999996, 16, 1;
16, 256, 575.99994, 256, 16;
35.999996, 575.99994, 1295.9996, 575.99994, 35.999996;
16, 256, 575.99994, 256, 16;
1, 16, 35.999996, 16, 1]
这种奇怪输出的原因是什么?当使用double而不是float时,问题也解决了,但我想知道原因
答案 0 :(得分:0)
我怀疑cv :: gpu :: pow实现使用了浮点值为你的值,而CPU实现使用了一个double,这导致你的结果不精确。
所以你的问题是由于浮点表示的精度。此问题称为ROUNDING ERROR。
一些有用的链接:Why Are Floating Point Numbers Inaccurate? 要么 http://faculty.tarleton.edu/agapie/documents/cs_343_arch/papers/1991_Goldberg_FloatingPoint.pdf
简而言之,这是因为整数不能总是用mantisse + exponent精确表示,具体取决于你的浮点类型(half,float,double)