diff --git a/Common/Core/vtkMath.h b/Common/Core/vtkMath.h index ea267a6470e5462ad773b465fe6b6dd42dde7b41..7de38c70c1f128e4c58cff6f4622dc89023cf4cd 100644 --- a/Common/Core/vtkMath.h +++ b/Common/Core/vtkMath.h @@ -1603,10 +1603,15 @@ namespace vtk_detail template <typename OutT> void RoundDoubleToIntegralIfNecessary(double val, OutT* ret) { // OutT is integral -- clamp and round - double min = static_cast<double>(vtkTypeTraits<OutT>::Min()); - double max = static_cast<double>(vtkTypeTraits<OutT>::Max()); - val = vtkMath::ClampValue(val, min, max); - *ret = static_cast<OutT>((val >= 0.0) ? (val + 0.5) : (val - 0.5)); + if (!vtkMath::IsNan(val)) + { + double min = static_cast<double>(vtkTypeTraits<OutT>::Min()); + double max = static_cast<double>(vtkTypeTraits<OutT>::Max()); + val = vtkMath::ClampValue(val, min, max); + *ret = static_cast<OutT>((val >= 0.0) ? (val + 0.5) : (val - 0.5)); + } + else + *ret = 0; } template <> inline void RoundDoubleToIntegralIfNecessary(double val, double* retVal) @@ -1616,10 +1621,15 @@ inline void RoundDoubleToIntegralIfNecessary(double val, double* retVal) template <> inline void RoundDoubleToIntegralIfNecessary(double val, float* retVal) { // OutT is float -- just clamp (as doubles, then the cast to float is well-defined.) - double min = static_cast<double>(vtkTypeTraits<float>::Min()); - double max = static_cast<double>(vtkTypeTraits<float>::Max()); - val = vtkMath::ClampValue(val, min, max); - *retVal = static_cast<float>(val); + if (!vtkMath::IsNan(val)) + { + double min = static_cast<double>(vtkTypeTraits<float>::Min()); + double max = static_cast<double>(vtkTypeTraits<float>::Max()); + val = vtkMath::ClampValue(val, min, max); + *retVal = static_cast<float>(val); + } + else + *retVal = val; } } // end namespace vtk_detail