mirror of
https://github.com/RGBCube/serenity
synced 2025-05-14 09:14:58 +00:00
AK: Add an exact and fast hex float parsing algorithm
Similar to decimal floating point parsing the current strtod hex float parsing gives a lot of incorrect results. We can use a similar technique as with decimal parsing however hex floats are much simpler as we don't need to scale with a power of 5. For hex floats we just provide the parse_first_hexfloat API as there is currently no need for a parse_hexfloat_completely API. Again the accepted input for parse_first_hexfloat is very lenient and any validation should be done before calling this method.
This commit is contained in:
parent
53b7f5e6a1
commit
2334cd85a2
3 changed files with 419 additions and 0 deletions
|
@ -62,7 +62,24 @@ FloatingPointParseResults<T> parse_first_floating_point_until_zero_character(cha
|
|||
template<FloatingPoint T = double>
|
||||
Optional<T> parse_floating_point_completely(char const* start, char const* end);
|
||||
|
||||
/// This function finds the first floating point as a hex float within [start, end).
|
||||
/// The accepted format is intentionally as lenient as possible. If your format is
|
||||
/// stricter you must validate it first. The format accepts:
|
||||
/// - An optional sign, both + and - are supported
|
||||
/// - Optionally either 0x or OX
|
||||
/// - 0 or more hexadecimal digits, with leading zeros allowed [1]
|
||||
/// - A decimal point '.', which can have no digits after it
|
||||
/// - 0 or more hexadecimal digits, unless the first digits [1] doesn't have any digits,
|
||||
/// then this must have at least one
|
||||
/// - An exponent 'p' or 'P' followed by an optional sign '+' or '-' and at least one decimal digit
|
||||
/// NOTE: The exponent is _not_ hexadecimal and gives powers of 2 not 16.
|
||||
/// This function additionally detects out of range values which have been rounded to
|
||||
/// [-]infinity or 0 and gives the next character to read after the floating point.
|
||||
template<FloatingPoint T = double>
|
||||
FloatingPointParseResults<T> parse_first_hexfloat_until_zero_character(char const* start);
|
||||
|
||||
}
|
||||
|
||||
using AK::parse_first_floating_point;
|
||||
using AK::parse_first_hexfloat_until_zero_character;
|
||||
using AK::parse_floating_point_completely;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue