susumu.yata
null+****@clear*****
Thu Nov 6 17:19:46 JST 2014
susumu.yata 2014-11-06 17:19:46 +0900 (Thu, 06 Nov 2014) New Revision: c094255e6ab46300ed390b258602dbe452187370 https://github.com/groonga/grnxx/commit/c094255e6ab46300ed390b258602dbe452187370 Message: Redefine Float::min() and add Float::normal/subnormal_min(). (#101) Modified files: include/grnxx/data_types/scalar/float.hpp test/test_data_types.cpp Modified: include/grnxx/data_types/scalar/float.hpp (+13 -1) =================================================================== --- include/grnxx/data_types/scalar/float.hpp 2014-11-06 16:53:00 +0900 (659b9ed) +++ include/grnxx/data_types/scalar/float.hpp 2014-11-06 17:19:46 +0900 (b856764) @@ -128,6 +128,12 @@ class Float { static constexpr Float max() { return Float(max_value()); } + static constexpr Float normal_min() { + return Float(normal_min_value()); + } + static constexpr Float subnormal_min() { + return Float(subnormal_min_value()); + } static constexpr Float infinity() { return Float(infinity_value()); } @@ -136,11 +142,17 @@ class Float { } static constexpr double min_value() { - return std::numeric_limits<double>::min(); + return std::numeric_limits<double>::lowest(); } static constexpr double max_value() { return std::numeric_limits<double>::max(); } + static constexpr double normal_min_value() { + return std::numeric_limits<double>::min(); + } + static constexpr double subnormal_min_value() { + return std::numeric_limits<double>::denorm_min(); + } static constexpr double infinity_value() { return std::numeric_limits<double>::infinity(); } Modified: test/test_data_types.cpp (+13 -5) =================================================================== --- test/test_data_types.cpp 2014-11-06 16:53:00 +0900 (9112699) +++ test/test_data_types.cpp 2014-11-06 17:19:46 +0900 (32eb411) @@ -459,12 +459,19 @@ void test_float() { assert(grnxx::Float(0.0).type() == grnxx::FLOAT_DATA); assert(grnxx::Float::min().type() == grnxx::FLOAT_DATA); assert(grnxx::Float::max().type() == grnxx::FLOAT_DATA); + assert(grnxx::Float::normal_min().type() == grnxx::FLOAT_DATA); + assert(grnxx::Float::subnormal_min().type() == grnxx::FLOAT_DATA); + assert(grnxx::Float::max().type() == grnxx::FLOAT_DATA); assert(grnxx::Float::infinity().type() == grnxx::FLOAT_DATA); assert(grnxx::Float::na().type() == grnxx::FLOAT_DATA); assert(grnxx::Float(0.0).value() == 0.0); assert(grnxx::Float::min().value() == grnxx::Float::min_value()); assert(grnxx::Float::max().value() == grnxx::Float::max_value()); + assert(grnxx::Float::normal_min().value() == + grnxx::Float::normal_min_value()); + assert(grnxx::Float::subnormal_min().value() == + grnxx::Float::subnormal_min_value()); assert(grnxx::Float::infinity().value() == grnxx::Float::infinity_value()); assert(std::isnan(grnxx::Float::na().value())); @@ -507,8 +514,8 @@ void test_float() { assert(-grnxx::Float(0.0) == grnxx::Float(0.0)); assert(-grnxx::Float(1.0) == grnxx::Float(-1.0)); - assert(-grnxx::Float::min() == grnxx::Float(-grnxx::Float::min_value())); - assert(-grnxx::Float::max() == grnxx::Float(-grnxx::Float::max_value())); + assert(-grnxx::Float::min() == grnxx::Float::max()); + assert(-grnxx::Float::max() == grnxx::Float::min()); assert(-grnxx::Float::infinity() == grnxx::Float(-grnxx::Float::infinity_value())); assert((-grnxx::Float::na()).is_na()); @@ -523,7 +530,7 @@ void test_float() { assert((grnxx::Float(1.0) - grnxx::Float(1.0)) == grnxx::Float(0.0)); assert((grnxx::Float::max() - -grnxx::Float::max()).is_infinite()); - assert((grnxx::Float::infinity() - grnxx::Float::min()).is_infinite()); + assert((grnxx::Float::infinity() - grnxx::Float::max()).is_infinite()); assert((grnxx::Float::infinity() - grnxx::Float::infinity()).is_na()); assert((grnxx::Float(1.0) - grnxx::Float::na()).is_na()); assert((grnxx::Float::na() - grnxx::Float(1.0)).is_na()); @@ -531,7 +538,8 @@ void test_float() { assert((grnxx::Float(2.0) * grnxx::Float(0.5)) == grnxx::Float(1.0)); assert((grnxx::Float::max() * grnxx::Float::max()).is_infinite()); - assert((grnxx::Float::infinity() * grnxx::Float::min()).is_infinite()); + assert((grnxx::Float::infinity() * grnxx::Float::subnormal_min()) + == grnxx::Float::infinity()); assert((grnxx::Float::infinity() * grnxx::Float(0.0)).is_na()); assert((grnxx::Float(1.0) * grnxx::Float::na()).is_na()); assert((grnxx::Float::na() * grnxx::Float(1.0)).is_na()); @@ -570,7 +578,7 @@ void test_float() { assert((grnxx::Float(1.0) / grnxx::Float(2.0)) == grnxx::Float(0.5)); assert((grnxx::Float(1.0) / grnxx::Float(0.0)).is_infinite()); assert((grnxx::Float(1.0) / grnxx::Float::infinity()) == grnxx::Float(0.0)); - assert((grnxx::Float::max() / grnxx::Float::min()).is_infinite()); + assert((grnxx::Float::max() / grnxx::Float::subnormal_min()).is_infinite()); assert((grnxx::Float::infinity() / grnxx::Float::max()).is_infinite()); assert((grnxx::Float::infinity() / grnxx::Float::infinity()).is_na()); assert((grnxx::Float(0.0) / grnxx::Float(0.0)).is_na()); -------------- next part -------------- HTML����������������������������...Télécharger