aboutsummaryrefslogtreecommitdiff
path: root/source/util/hex_float.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/util/hex_float.h')
-rw-r--r--source/util/hex_float.h16
1 files changed, 15 insertions, 1 deletions
diff --git a/source/util/hex_float.h b/source/util/hex_float.h
index cfc40fa6..be28eae3 100644
--- a/source/util/hex_float.h
+++ b/source/util/hex_float.h
@@ -1005,6 +1005,9 @@ std::istream& operator>>(std::istream& is, HexFloat<T, Traits>& value) {
is.get();
next_char = is.peek();
}
+
+ // Finished reading the part preceding any '.' or 'p'.
+
bits_written = false;
while (seen_dot && !seen_p) {
// Handle only fractional parts now.
@@ -1037,11 +1040,16 @@ std::istream& operator>>(std::istream& is, HexFloat<T, Traits>& value) {
next_char = is.peek();
}
+ // Finished reading the part preceding 'p'.
+ // In hex floats syntax, the binary exponent is required.
+
bool seen_sign = false;
int8_t exponent_sign = 1;
+ bool seen_written_exponent_digits = false;
int_type written_exponent = 0;
while (true) {
- if ((next_char == '-' || next_char == '+')) {
+ if (!seen_written_exponent_digits &&
+ (next_char == '-' || next_char == '+')) {
if (seen_sign) {
is.setstate(std::ios::failbit);
return is;
@@ -1049,6 +1057,7 @@ std::istream& operator>>(std::istream& is, HexFloat<T, Traits>& value) {
seen_sign = true;
exponent_sign = (next_char == '-') ? -1 : 1;
} else if (::isdigit(next_char)) {
+ seen_written_exponent_digits = true;
// Hex-floats express their exponent as decimal.
written_exponent = static_cast<int_type>(written_exponent * 10);
written_exponent =
@@ -1059,6 +1068,11 @@ std::istream& operator>>(std::istream& is, HexFloat<T, Traits>& value) {
is.get();
next_char = is.peek();
}
+ if (!seen_written_exponent_digits) {
+ // Binary exponent had no digits.
+ is.setstate(std::ios::failbit);
+ return is;
+ }
written_exponent = static_cast<int_type>(written_exponent * exponent_sign);
exponent = static_cast<int_type>(exponent + written_exponent);