diff --git a/inference-engine/src/legacy_api/src/net_pass.cpp b/inference-engine/src/legacy_api/src/net_pass.cpp index 65a04b1044b..bc811a4ad0c 100644 --- a/inference-engine/src/legacy_api/src/net_pass.cpp +++ b/inference-engine/src/legacy_api/src/net_pass.cpp @@ -1330,13 +1330,28 @@ bool UnrollRNN_if(TensorIterator::Body& net, const std::function +bool isConversionNarrowing(FROM from) { + return from == (static_cast(static_cast(from))); +} + +template +TO saturatedCast(FROM from) { + FROM max = isConversionNarrowing(std::numeric_limits::max()) ? std::numeric_limits::max() : + static_cast(std::numeric_limits::max()); + FROM min = isConversionNarrowing(std::numeric_limits::min()) ? std::numeric_limits::min() : + static_cast(std::numeric_limits::min()); + + return static_cast(std::min(std::max(from, min), max)); +} + template void convertArrayPrecision(typename PrecisionTrait::value_type* dst, const typename PrecisionTrait::value_type* src, size_t nelem) { using dst_type = typename PrecisionTrait::value_type; for (size_t i = 0; i < nelem; i++) { - dst[i] = static_cast(src[i]); + dst[i] = saturatedCast(src[i]); } }