From 0d0a78ebd60e058746ea161914b45709245d4e1b Mon Sep 17 00:00:00 2001 From: Francis Murtagh Date: Fri, 22 Feb 2019 16:35:13 +0000 Subject: IVGCVSW-2721 Quantize and Dequantize aren't quite right * Add check for infinity and negative infinity in quantize() * Add assert for NaN value in quantize and dequantize() * Add unit tests for infinity and negative infinity Change-Id: Ie60e1e15b289ccbf99df4a3281f067b82cc9f9bf Signed-off-by: Francis Murtagh --- include/armnn/TypesUtils.hpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'include') diff --git a/include/armnn/TypesUtils.hpp b/include/armnn/TypesUtils.hpp index c65eefc510..e7652649b0 100644 --- a/include/armnn/TypesUtils.hpp +++ b/include/armnn/TypesUtils.hpp @@ -189,18 +189,16 @@ inline std::ostream & operator<<(std::ostream & os, const armnn::TensorShape & s template inline QuantizedType Quantize(float value, float scale, int32_t offset) { - // TODO : check we act sensibly for Inf, NaN and -Inf - // see IVGCVSW-1849 static_assert(IsQuantizedType(), "Not an integer type."); constexpr QuantizedType max = std::numeric_limits::max(); constexpr QuantizedType min = std::numeric_limits::lowest(); BOOST_ASSERT(scale != 0.f); - int quantized = boost::numeric_cast(round(value / scale)) + offset; - QuantizedType quantizedBits = quantized <= min - ? min - : quantized >= max - ? max - : static_cast(quantized); + BOOST_ASSERT(!std::isnan(value)); + + float clampedValue = std::min(std::max(static_cast(round(value/scale) + offset), static_cast(min)), + static_cast(max)); + auto quantizedBits = static_cast(clampedValue); + return quantizedBits; } @@ -215,6 +213,7 @@ inline float Dequantize(QuantizedType value, float scale, int32_t offset) { static_assert(IsQuantizedType(), "Not an integer type."); BOOST_ASSERT(scale != 0.f); + BOOST_ASSERT(!std::isnan(value)); float dequantized = boost::numeric_cast(value - offset) * scale; return dequantized; } -- cgit v1.2.1