MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add support for fractional and exponential parts in decimal parsing

+23 -11
+1 -1
meson.build
··· 96 96 build_date = run_command('date', '+%Y-%m-%d', check: true).stdout().strip() 97 97 98 98 version_conf = configuration_data() 99 - version_conf.set('ANT_VERSION', '0.3.2.19') 99 + version_conf.set('ANT_VERSION', '0.3.2.20') 100 100 version_conf.set('ANT_GIT_HASH', git_hash) 101 101 version_conf.set('ANT_BUILD_DATE', build_date) 102 102
+22 -10
src/ant.c
··· 3656 3656 }; 3657 3657 3658 3658 static inline jsoff_t parse_decimal(const char *buf, jsoff_t maxlen, double *out) { 3659 - double val = 0.0; 3659 + uint64_t int_part = 0, frac_part = 0; 3660 + int frac_digits = 0; 3660 3661 jsoff_t i = 0; 3661 3662 3662 3663 while (i < maxlen && (IS_DIGIT(buf[i]) || buf[i] == '_')) { 3663 - if (buf[i] != '_') val = val * 10.0 + (buf[i] - '0'); 3664 + if (buf[i] != '_') int_part = int_part * 10 + (buf[i] - '0'); 3664 3665 i++; 3665 3666 } 3666 3667 3667 3668 if (i < maxlen && buf[i] == '.') { 3668 3669 i++; 3669 - double frac = 0.1; 3670 3670 while (i < maxlen && (IS_DIGIT(buf[i]) || buf[i] == '_')) { 3671 - if (buf[i] != '_') { val += (buf[i] - '0') * frac; frac *= 0.1; } 3671 + if (buf[i] != '_') { frac_part = frac_part * 10 + (buf[i] - '0'); frac_digits++; } 3672 3672 i++; 3673 3673 } 3674 3674 } 3675 3675 3676 + static const double neg_pow10[] = { 3677 + 1e0,1e-1,1e-2,1e-3,1e-4,1e-5,1e-6,1e-7,1e-8,1e-9,1e-10, 3678 + 1e-11,1e-12,1e-13,1e-14,1e-15,1e-16,1e-17,1e-18,1e-19,1e-20 3679 + }; 3680 + 3681 + static const double pos_pow10[] = { 3682 + 1e0,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10, 3683 + 1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19,1e20 3684 + }; 3685 + 3686 + double val = (double)int_part; 3687 + if (frac_digits > 0) { 3688 + val += (frac_digits <= 20) 3689 + ? (double)frac_part * neg_pow10[frac_digits] 3690 + : (double)frac_part * pow(10.0, -frac_digits); 3691 + } 3692 + 3676 3693 if (i < maxlen && (buf[i] == 'e' || buf[i] == 'E')) { 3677 3694 i++; 3678 3695 int exp_sign = 1, exp_val = 0; ··· 3684 3701 if (buf[i] != '_') exp_val = exp_val * 10 + (buf[i] - '0'); 3685 3702 i++; 3686 3703 } 3687 - static const double pow10[] = { 3688 - 1e0,1e1,1e2,1e3,1e4,1e5,1e6,1e7,1e8,1e9,1e10, 3689 - 1e11,1e12,1e13,1e14,1e15,1e16,1e17,1e18,1e19,1e20 3690 - }; 3691 - 3692 3704 if (exp_val <= 20) { 3693 - val = (exp_sign > 0) ? val * pow10[exp_val] : val / pow10[exp_val]; 3705 + val = (exp_sign > 0) ? val * pos_pow10[exp_val] : val * neg_pow10[exp_val]; 3694 3706 } else val *= pow(10.0, exp_sign * exp_val); 3695 3707 } 3696 3708