From 7e68fcdcde738d408e13418e1f04ac45ea7cf055 Mon Sep 17 00:00:00 2001 From: cmlchen Date: Fri, 21 Jun 2019 09:40:33 +0800 Subject: [PATCH 1/3] use fpclassify to test a float number is zero or nan --- src/lib_json/json_value.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index b046c1939..6ea2fc04a 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -848,8 +848,8 @@ bool Value::asBool() const { case uintValue: return value_.uint_ ? true : false; case realValue: - // This is kind of strange. Not recommended. - return (value_.real_ != 0.0) ? true : false; + // According to JavaScript language zero or NaN is regarded as false + return std::fpclassify(value_.real_) != FP_ZERO && std::fpclassify(value_.real_) != FP_NAN default: break; } From 1f16fc4b1dfaeed038d685839aad6a0558fb96a8 Mon Sep 17 00:00:00 2001 From: cmlchen Date: Fri, 21 Jun 2019 10:23:20 +0800 Subject: [PATCH 2/3] fix compile problem --- src/lib_json/json_value.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 6ea2fc04a..0a06b016d 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -849,7 +849,7 @@ bool Value::asBool() const { return value_.uint_ ? true : false; case realValue: // According to JavaScript language zero or NaN is regarded as false - return std::fpclassify(value_.real_) != FP_ZERO && std::fpclassify(value_.real_) != FP_NAN + return std::fpclassify(value_.real_) != FP_ZERO && std::fpclassify(value_.real_) != FP_NAN; default: break; } From 49addc16991134fd51a3005f409bf061d9c24e4c Mon Sep 17 00:00:00 2001 From: cmlchen Date: Tue, 25 Jun 2019 11:26:29 +0800 Subject: [PATCH 3/3] extract variable --- src/lib_json/json_value.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lib_json/json_value.cpp b/src/lib_json/json_value.cpp index 0a06b016d..f7c53d9f5 100644 --- a/src/lib_json/json_value.cpp +++ b/src/lib_json/json_value.cpp @@ -847,9 +847,11 @@ bool Value::asBool() const { return value_.int_ ? true : false; case uintValue: return value_.uint_ ? true : false; - case realValue: - // According to JavaScript language zero or NaN is regarded as false - return std::fpclassify(value_.real_) != FP_ZERO && std::fpclassify(value_.real_) != FP_NAN; + case realValue: { + // According to JavaScript language zero or NaN is regarded as false + const auto value_classification = std::fpclassify(value_.real_); + return value_classification != FP_ZERO && value_classification != FP_NAN; + } default: break; }