cv :: cuda :: pow中浮点数的输出?

时间:2016-12-20 13:01:42

标签: opencv

一个简单的浮动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时,问题也解决了,但我想知道原因

1 个答案:

答案 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)