30#define LEXBOR_DECIMAL_POWER_MAX 309
31#define LEXBOR_DECIMAL_POWER_MIN (-324)
33#define LEXBOR_UINT64_MAX lexbor_uint64_hl(0xFFFFFFFF, 0xFFFFFFFF)
34#define LEXBOR_UINT64_DECIMAL_DIGITS_MAX 19
36#define LEXBOR_DENOM_LOG 3
37#define LEXBOR_DENOM (1 << LEXBOR_DENOM_LOG)
68 while (
p < e &&
value <= (UINT64_MAX / 10 - 1)) {
85lexbor_strtod_diyfp_read(
const lxb_char_t *
start,
size_t length,
int *remaining)
95 if (
start[read] >=
'5') {
100 *remaining = (int) (length - read);
161 int magnitude, prec_digits;
162 int remaining, dec_exp, adj_exp, orig_e, shift;
164 uint64_t prec_bits, half_way;
167 value = lexbor_strtod_diyfp_read(
start, length, &remaining);
190 if (dec_exp !=
exp) {
191 adj_exp =
exp - dec_exp;
245 prec_digits -= shift;
248 prec_bits =
value.significand & (((uint64_t) 1 << prec_digits) - 1);
251 half_way = (uint64_t) 1 << (prec_digits - 1);
256 if (prec_bits >= half_way +
error) {
316 return lexbor_strtod_diyfp_strtod(
start, length,
exp);
319#undef LEXBOR_DECIMAL_POWER_MAX
320#undef LEXBOR_DECIMAL_POWER_MIN
322#undef LEXBOR_UINT64_MAX
323#undef LEXBOR_UINT64_DECIMAL_DIGITS_MAX
325#undef LEXBOR_DENOM_LOG
pow(mixed $num, mixed $exponent)
lexbor_diyfp_t lexbor_cached_power_dec(int exp, int *dec_exp)
lxb_inline lexbor_diyfp_t lexbor_diyfp_shift_right(lexbor_diyfp_t v, unsigned shift)
#define LEXBOR_DIYFP_SIGNIFICAND_SIZE
lxb_inline lexbor_diyfp_t lexbor_diyfp_mul(lexbor_diyfp_t lhs, lexbor_diyfp_t rhs)
#define LEXBOR_DECIMAL_EXPONENT_MIN
#define lexbor_diyfp(_s, _e)
#define LEXBOR_SIGNIFICAND_SIZE
lxb_inline double lexbor_diyfp_2d(lexbor_diyfp_t v)
#define LEXBOR_DBL_EXPONENT_DENORMAL
#define lexbor_uint64_hl(h, l)
lxb_inline lexbor_diyfp_t lexbor_diyfp_normalize(lexbor_diyfp_t v)
lxb_inline int lexbor_strtod_diyfp_sgnd_size(int order)
lxb_inline uint64_t lexbor_strtod_read_uint64(const lxb_char_t *start, size_t length, size_t *ndigits)
#define LEXBOR_UINT64_DECIMAL_DIGITS_MAX
#define LEXBOR_DECIMAL_POWER_MIN
lxb_inline lexbor_diyfp_t lexbor_strtod_adjust_pow10(int exp)
#define LEXBOR_DECIMAL_POWER_MAX
double lexbor_strtod_internal(const lxb_char_t *start, size_t length, int exp)