vtkFloorFuncMacro produces incorrect results on i386
This issue was created automatically from an original Mantis Issue. Further discussion may take place here.
In file Rendering/vtkVolumeRayCastMapper.h there is a function named vtkFloorFuncMacro. This function does not produce correct results for all inputs on a platform that does not use the "quick-and-dirty" solution:
inline int vtkFloorFuncMacro(double x) { #if defined i386 || defined _M_IX86 double tempval; // use 52-bit precision of IEEE double to round (x - 0.25) to // the nearest multiple of 0.5, according to prevailing rounding // mode which is IEEE round-to-nearest,even tempval = (x - 0.25) + 3377699720527872.0; // (2**51)1.5 // extract mantissa, use shift to divide by 2 and hence get rid // of the bit that gets messed up because the FPU uses // round-to-nearest,even mode instead of round-to-nearest,+infinity return ((int)&tempval)[0] >> 1; #else // quick-and-dirty, assumes x >= 0 return (int)(x); #endif }
As an example take vtkFloorFuncMacro(0.99989) which should return 0. Instead it returns 1, which is wrong. Because of failures like this, volume rendering that uses vtkVolumeRayCastMapper can produce random crashes. After I replaced the body of this function with the standard "floor(x)" all the random crashes I experienced before are gone.