25#ifndef __JOIN_DTOA_HPP__
26#define __JOIN_DTOA_HPP__
46 *buffer++ =
'0' + k / 100;
48 *buffer++ =
'0' + k / 10;
53 *buffer++ =
'0' + k / 10;
60 inline char*
prettify (
char* buffer,
int length,
int k)
64 if ((length <= kk) && (kk <= 21))
66 memset (buffer + length,
'0', kk - length);
69 return &buffer[kk + 2];
71 else if ((0 < kk) && (kk <= 21))
73 memmove (&buffer[kk + 1], &buffer[kk], length - kk);
75 return &buffer[length + 1];
77 else if ((-6 < kk) && (kk <= 0))
80 memmove (&buffer[offset], &buffer[0], length);
83 memset (&buffer[2],
'0', offset - 2);
84 return &buffer[length + offset];
93 memmove (&buffer[2], &buffer[1], length - 1);
95 buffer[length + 1] =
'e';
100 inline void grisuRound (
char* buffer,
int length, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w)
102 while (rest < wp_w && delta - rest >= ten_kappa && (rest + ten_kappa < wp_w || wp_w - rest > rest + ten_kappa - wp_w))
104 --buffer[length - 1];
111 if (n < 10)
return 1;
112 if (n < 100)
return 2;
113 if (n < 1000)
return 3;
114 if (n < 10000)
return 4;
115 if (n < 100000)
return 5;
116 if (n < 1000000)
return 6;
117 if (n < 10000000)
return 7;
118 if (n < 100000000)
return 8;
119 if (n < 1000000000)
return 9;
125 static const uint32_t kPow10[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000};
138 case 10: d = p1 / 1000000000; p1 %= 1000000000;
break;
139 case 9: d = p1 / 100000000; p1 %= 100000000;
break;
140 case 8: d = p1 / 10000000; p1 %= 10000000;
break;
141 case 7: d = p1 / 1000000; p1 %= 1000000;
break;
142 case 6: d = p1 / 100000; p1 %= 100000;
break;
143 case 5: d = p1 / 10000; p1 %= 10000;
break;
144 case 4: d = p1 / 1000; p1 %= 1000;
break;
145 case 3: d = p1 / 100; p1 %= 100;
break;
146 case 2: d = p1 / 10; p1 %= 10;
break;
147 case 1: d = p1; p1 = 0;
break;
152 buffer[length++] =
'0' + d;
155 uint64_t tmp = (
static_cast <uint64_t
> (p1) << -one.
_exponent) + p2;
167 p2 *= 10; delta *= 10; unit *= 10;
168 char d =
static_cast <char> (p2 >> -one.
_exponent);
171 buffer[length++] =
'0' + d;
186 return static_cast <int> (::ceil ((alpha - exp + 63) * 0.30102999566398114));
189 inline void grisu2 (
char* buffer,
int& length,
int& k,
double value)
191 DiyFp val (value), minus, plus;
215 inline char*
dtoa (
char* buffer,
double value)
218 memcpy (&bits, &value,
sizeof(
double));
219 bool is_negative = (bits >> 63) != 0;
222 buffer += is_negative;
223 value = is_negative ? -value : value;
227 memcpy (buffer,
"0.0", 3);
231 int length = 0, k = 0;
hand made floating point.
Definition diyfp.hpp:42
int _exponent
exponent.
Definition diyfp.hpp:227
uint64_t _mantissa
mantissa.
Definition diyfp.hpp:224
constexpr void normalizedBoundaries(DiyFp &minus, DiyFp &plus) const noexcept
get normalized boundaries.
Definition diyfp.hpp:148
void digitsGen(DiyFp W, DiyFp Mp, uint64_t delta, char *buffer, int &length, int &k)
Definition dtoa.hpp:123
int kComputation(int exp, int alpha)
Definition dtoa.hpp:184
char * prettify(char *buffer, int length, int k)
Definition dtoa.hpp:60
size_t digitsCount(uint32_t n)
Definition dtoa.hpp:109
constexpr DiyFp dtoapow[]
Definition dtoapow.hpp:35
void grisuRound(char *buffer, int length, uint64_t delta, uint64_t rest, uint64_t ten_kappa, uint64_t wp_w)
Definition dtoa.hpp:100
void grisu2(char *buffer, int &length, int &k, double value)
Definition dtoa.hpp:189
char * writeExponent(char *buffer, int k)
Definition dtoa.hpp:39
Definition acceptor.hpp:32
char * dtoa(char *buffer, double value)
double to string conversion.
Definition dtoa.hpp:215