Skip to content

Commit

Permalink
code for supporting subnormal float values from bdice
Browse files Browse the repository at this point in the history
  • Loading branch information
davidwendt committed Apr 18, 2022
1 parent 75db733 commit 958f3f9
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 8 deletions.
20 changes: 13 additions & 7 deletions cpp/src/strings/convert/convert_floats.cu
Original file line number Diff line number Diff line change
Expand Up @@ -124,20 +124,26 @@ __device__ inline double stod(string_view const& d_str)
exp_ten *= exp_sign;
exp_ten += exp_off;
exp_ten += num_digits - 1;
if (exp_ten > std::numeric_limits<double>::max_exponent10)
if (exp_ten > std::numeric_limits<double>::max_exponent10) {
return sign > 0 ? std::numeric_limits<double>::infinity()
: -std::numeric_limits<double>::infinity();
else if (exp_ten < std::numeric_limits<double>::min_exponent10)
return double{0};
}
// else if (exp_ten < std::numeric_limits<double>::min_exponent10)
// return double{0};

double base = sign * static_cast<double>(digits);

exp_ten += 1 - num_digits;
// extra floating-point division needed only in extreme range (e-287 - e-307)
// where num_digits may push exp_ten below min_exponent10 (e-307)
if (exp_ten < std::numeric_limits<double>::min_exponent10) {
base = base / exp10(static_cast<double>(num_digits - 1));
// If 10^exp_ten would result in a subnormal value, the base and
// exponent should be adjusted so that 10^exp_ten is a normal value
auto const subnormal_shift = std::numeric_limits<double>::min_exponent10 - exp_ten;
if (subnormal_shift > 0) {
// Handle subnormal values. Ensure that both base and exponent are
// normal values before computing their product.
base = base / exp10(static_cast<double>(num_digits - 1 + subnormal_shift));
exp_ten += num_digits - 1; // adjust exponent
auto const exponent = exp10(static_cast<double>(exp_ten + subnormal_shift));
return base * exponent;
}

double const exponent = exp10(static_cast<double>(std::abs(exp_ten)));
Expand Down
4 changes: 3 additions & 1 deletion cpp/tests/strings/floats_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,9 @@ TEST_F(StringsConvertTest, ToFloats64)
"1234", nullptr, "-876", "543.2", "-0.12", ".25",
"-.002", "", "-0.0", "1.28e256", "NaN", "abc123",
"123abc", "456e", "-1.78e+5", "-122.33644782", "12e+309", "1.7976931348623159E308",
"-Inf", "-INFINITY", "1.0", "1.7976931348623157e+308", "1.7976931348623157e-307"};
"-Inf", "-INFINITY", "1.0", "1.7976931348623157e+308", "1.7976931348623157e-307",
// subnormal numbers
"4e-308", "3.3333333333e-320", "4.940656458412465441765688e-324", "1.e-324" };
// clang-format on
cudf::test::strings_column_wrapper strings(
h_strings.begin(),
Expand Down

0 comments on commit 958f3f9

Please sign in to comment.