mirror of
https://github.com/fastfloat/fast_float.git
synced 2025-12-07 01:06:48 +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>
|
template <typename T, typename UC>
|
||||||
FASTFLOAT_CONSTEXPR20 from_chars_result_t<UC>
|
FASTFLOAT_CONSTEXPR20 from_chars_result_t<UC>
|
||||||
from_chars_advanced(parsed_number_string_t<UC> &pns, T &value) noexcept {
|
from_chars_advanced(parsed_number_string_t<UC> &pns, T &value) noexcept {
|
||||||
|
printf("from_chars_advanced\n");
|
||||||
static_assert(is_supported_float_type<T>(),
|
static_assert(is_supported_float_type<T>(),
|
||||||
"only some floating-point types are supported");
|
"only some floating-point types are supported");
|
||||||
static_assert(is_supported_char_type<UC>(),
|
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) {
|
if (am.power2 < 0) {
|
||||||
am = digit_comp<T>(pns, am);
|
am = digit_comp<T>(pns, am);
|
||||||
}
|
}
|
||||||
to_float(pns.negative, am, value);
|
|
||||||
// Test for over/underflow.
|
// Test for over/underflow.
|
||||||
if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) ||
|
if ((pns.mantissa != 0 && am.mantissa == 0 && am.power2 == 0) ||
|
||||||
am.power2 == binary_format<T>::infinite_power()) {
|
am.power2 == binary_format<T>::infinite_power()) {
|
||||||
answer.ec = std::errc::result_out_of_range;
|
answer.ec = std::errc::result_out_of_range;
|
||||||
|
} else {
|
||||||
|
to_float(pns.negative, am, value);
|
||||||
}
|
}
|
||||||
return answer;
|
return answer;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -76,6 +76,15 @@ const char *round_name(int d) {
|
|||||||
#define FASTFLOAT_STR(x) #x
|
#define FASTFLOAT_STR(x) #x
|
||||||
#define SHOW_DEFINE(x) printf("%s='%s'\n", #x, FASTFLOAT_STR(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") {
|
TEST_CASE("system_info") {
|
||||||
std::cout << "system info:" << std::endl;
|
std::cout << "system info:" << std::endl;
|
||||||
#ifdef FASTFLOAT_CONSTEXPR_TESTS
|
#ifdef FASTFLOAT_CONSTEXPR_TESTS
|
||||||
@ -400,6 +409,8 @@ TEST_CASE("full_multiplication") {
|
|||||||
test_full_multiplication(bit << 63, bit << 63, 0u, bit << 62);
|
test_full_multiplication(bit << 63, bit << 63, 0u, bit << 62);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
TEST_CASE("issue8") {
|
TEST_CASE("issue8") {
|
||||||
const char *s =
|
const char *s =
|
||||||
"3."
|
"3."
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user