fixed #42 (removed equality comparisons for floats)

This commit is contained in:
Niels 2015-03-23 23:03:48 +01:00
parent 8e1c5f2221
commit 43417c350b
3 changed files with 21 additions and 7 deletions

View file

@ -3,7 +3,7 @@ RE2C = re2c
SED = gsed SED = gsed
# additional flags # additional flags
FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated FLAGS = -Wall -Wextra -pedantic -Weffc++ -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wmissing-declarations -Wmissing-include-dirs -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-overflow=5 -Wswitch -Wundef -Wno-unused -Wnon-virtual-dtor -Wreorder -Wdeprecated -Wfloat-equal
all: json_unit all: json_unit

View file

@ -1571,11 +1571,11 @@ class basic_json
{ {
if (rhs.type() == value_t::number_integer) if (rhs.type() == value_t::number_integer)
{ {
return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer); return approx(lhs.m_value.number_float, static_cast<number_float_t>(rhs.m_value.number_integer));
} }
if (rhs.type() == value_t::number_float) if (rhs.type() == value_t::number_float)
{ {
return lhs.m_value.number_float == rhs.m_value.number_float; return approx(lhs.m_value.number_float, rhs.m_value.number_float);
} }
break; break;
} }
@ -2008,6 +2008,13 @@ class basic_json
} }
} }
/// "equality" comparison for floating point numbers
template<typename T>
inline static bool approx(const T a, const T b)
{
return not (a > b or a < b);
}
private: private:
////////////////////// //////////////////////
@ -4275,7 +4282,7 @@ basic_json_parser_59:
// check if conversion loses precision // check if conversion loses precision
const auto int_val = static_cast<number_integer_t>(float_val); const auto int_val = static_cast<number_integer_t>(float_val);
if (float_val == int_val) if (approx(float_val, static_cast<number_float_t>(int_val)))
{ {
// we basic_json not lose precision -> return int // we basic_json not lose precision -> return int
return basic_json(int_val); return basic_json(int_val);

View file

@ -1571,11 +1571,11 @@ class basic_json
{ {
if (rhs.type() == value_t::number_integer) if (rhs.type() == value_t::number_integer)
{ {
return lhs.m_value.number_float == static_cast<number_float_t>(rhs.m_value.number_integer); return approx(lhs.m_value.number_float, static_cast<number_float_t>(rhs.m_value.number_integer));
} }
if (rhs.type() == value_t::number_float) if (rhs.type() == value_t::number_float)
{ {
return lhs.m_value.number_float == rhs.m_value.number_float; return approx(lhs.m_value.number_float, rhs.m_value.number_float);
} }
break; break;
} }
@ -2008,6 +2008,13 @@ class basic_json
} }
} }
/// "equality" comparison for floating point numbers
template<typename T>
inline static bool approx(const T a, const T b)
{
return not (a > b or a < b);
}
private: private:
////////////////////// //////////////////////
@ -3624,7 +3631,7 @@ class basic_json
// check if conversion loses precision // check if conversion loses precision
const auto int_val = static_cast<number_integer_t>(float_val); const auto int_val = static_cast<number_integer_t>(float_val);
if (float_val == int_val) if (approx(float_val, static_cast<number_float_t>(int_val)))
{ {
// we basic_json not lose precision -> return int // we basic_json not lose precision -> return int
return basic_json(int_val); return basic_json(int_val);