mirror of
https://github.com/fastfloat/fast_float.git
synced 2025-12-06 16:56:57 +08:00
fixing issue 261
This commit is contained in:
parent
3642e92a36
commit
311e4c20d4
@ -199,7 +199,7 @@ from_chars(UC const *first, UC const *last, T &value,
|
||||
template <typename T, typename UC>
|
||||
FASTFLOAT_CONSTEXPR20 from_chars_result_t<UC>
|
||||
from_chars_advanced(parsed_number_string_t<UC> &pns, T &value) noexcept {
|
||||
|
||||
printf("from_chars_advanced\n");
|
||||
static_assert(is_supported_float_type<T>(),
|
||||
"only some floating-point types are supported");
|
||||
static_assert(is_supported_char_type<UC>(),
|
||||
@ -275,11 +275,12 @@ from_chars_advanced(parsed_number_string_t<UC> &pns, T &value) noexcept {
|
||||
if (am.power2 < 0) {
|
||||
am = digit_comp<T>(pns, am);
|
||||
}
|
||||
to_float(pns.negative, am, value);
|
||||
// Test for over/underflow.
|
||||
if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) ||
|
||||
am.power2 == binary_format<T>::infinite_power()) {
|
||||
answer.ec = std::errc::result_out_of_range;
|
||||
} else {
|
||||
to_float(pns.negative, am, value);
|
||||
}
|
||||
return answer;
|
||||
}
|
||||
|
||||
@ -76,6 +76,15 @@ const char *round_name(int d) {
|
||||
#define FASTFLOAT_STR(x) #x
|
||||
#define SHOW_DEFINE(x) printf("%s='%s'\n", #x, FASTFLOAT_STR(x))
|
||||
|
||||
TEST_CASE("issue261") {
|
||||
std::string_view str = "5.47382e-48";
|
||||
float value = 100.0f;
|
||||
auto res = fast_float::from_chars(str.data(), str.data() + str.size(), value, fast_float::general);
|
||||
CHECK_MESSAGE(res.ec == std::errc::result_out_of_range, "value is out of range (interpretation of the standard)");
|
||||
std::cout << "value = " << fHexAndDec(value) << std::endl;
|
||||
CHECK_MESSAGE(value == 100.0f, "value should be unchanged");
|
||||
CHECK_MESSAGE(res.ptr == str.data() + str.size(), "should point to end of matching pattern");
|
||||
}
|
||||
TEST_CASE("system_info") {
|
||||
std::cout << "system info:" << std::endl;
|
||||
#ifdef FASTFLOAT_CONSTEXPR_TESTS
|
||||
@ -400,6 +409,8 @@ TEST_CASE("full_multiplication") {
|
||||
test_full_multiplication(bit << 63, bit << 63, 0u, bit << 62);
|
||||
}
|
||||
|
||||
|
||||
|
||||
TEST_CASE("issue8") {
|
||||
const char *s =
|
||||
"3."
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user