Weird cast in surf.cpp?

asked 2017-02-09 13:35:02 -0500

lovaj gravatar image

I'm trying to improve surf.cpp performances. From line 140, you can find this function:

inline float calcHaarPattern( const int* origin, const SurfHF* f, int n )
    double d = 0;
    for( int k = 0; k < n; k++ )
        d += (origin[f[k].p0] + origin[f[k].p3] - origin[f[k].p1] - origin[f[k].p2])*f[k].w;
    return (float)d;

Running an Intel Advisor Vectorization analysis, it shows that "1 Data type conversions present" which could be inefficient (especially in vectorization).

But my question is: looking at this function, why the authors would have created d as double and then cast it to float? If they wanted a decimal number, float would be ok. The only reason that comes to my mind is that since double is more precise than float, then it can represents smaller numbers, but the final value is big enough to be stored in a float, but I didn't run any test on d value.

Any other possible reason?

edit retag flag offensive close merge delete