From f63a33884f411e312d7ad59195f3887dff87990e Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Thu, 30 Jan 2025 07:36:18 -0600 Subject: [PATCH] Add hexfloats - Address #1550 --- src/core/strtod.c | 12 ++++++++++-- test/suite-parse.janet | 3 +++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/core/strtod.c b/src/core/strtod.c index 67247aa6..17fbc450 100644 --- a/src/core/strtod.c +++ b/src/core/strtod.c @@ -298,8 +298,10 @@ int janet_scan_number_base( } /* If still base is 0, set to default (10) */ + int exp_base = base; if (base == 0) { base = 10; + exp_base = 10; } /* Skip leading zeros */ @@ -322,6 +324,12 @@ int janet_scan_number_base( } else if (*str == '&') { foundexp = 1; break; + } else if (base == 16 && (*str == 'P' || *str == 'p')) { /* IEEE hex float */ + foundexp = 1; + exp_base = 10; + base = 2; + ex *= 4; /* We need to correct the current exponent after we change the base */ + break; } else if (base == 10 && (*str == 'E' || *str == 'e')) { foundexp = 1; break; @@ -360,9 +368,9 @@ int janet_scan_number_base( } while (str < end) { int digit = digit_lookup[*str & 0x7F]; - if (*str > 127 || digit >= base) goto error; + if (*str > 127 || digit >= exp_base) goto error; if (ee < (INT32_MAX / 40)) { - ee = base * ee + digit; + ee = exp_base * ee + digit; } str++; seenadigit = 1; diff --git a/test/suite-parse.janet b/test/suite-parse.janet index 05b34292..08e8a993 100644 --- a/test/suite-parse.janet +++ b/test/suite-parse.janet @@ -208,5 +208,8 @@ (parser/consume p `")`) (assert (= (parser/produce p) ["hello"])) +# Hex floats +(assert (= math/pi +0x1.921fb54442d18p+0001)) + (end-suite)