MCPcopy Create free account
hub / github.com/Tracktion/choc / generateDigits

Method generateDigits

choc/text/choc_FloatToString.h:119–174  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

117 };
118
119 static uint32_t generateDigits (char* buffer, MantissaAndExponent upperBound, uint64_t mantissaDiff, uint64_t delta, int& K)
120 {
121 uint32_t length = 0;
122 const auto one = MantissaAndExponent { 1ull << -upperBound.exponent, upperBound.exponent };
123 auto p1 = static_cast<uint32_t> (upperBound.mantissa >> -one.exponent);
124 auto p2 = upperBound.mantissa & (one.mantissa - 1);
125 auto numDigits = math::getNumDecimalDigits (p1);
126
127 for (;;)
128 {
129 auto digit = p1;
130
131 switch (--numDigits)
132 {
133 case 0: p1 = 0; break;
134 case 1: digit /= powersOf10[1]; p1 %= powersOf10[1]; break;
135 case 2: digit /= powersOf10[2]; p1 %= powersOf10[2]; break;
136 case 3: digit /= powersOf10[3]; p1 %= powersOf10[3]; break;
137 case 4: digit /= powersOf10[4]; p1 %= powersOf10[4]; break;
138 case 5: digit /= powersOf10[5]; p1 %= powersOf10[5]; break;
139 case 6: digit /= powersOf10[6]; p1 %= powersOf10[6]; break;
140 case 7: digit /= powersOf10[7]; p1 %= powersOf10[7]; break;
141 case 8: digit /= powersOf10[8]; p1 %= powersOf10[8]; break;
142 default: break;
143 }
144
145 writeDigitIfNotLeadingZero (buffer, length, digit);
146 auto rest = p2 + (static_cast<uint64_t> (p1) << -one.exponent);
147
148 if (rest <= delta)
149 {
150 K += numDigits;
151 roundFinalDigit (buffer, length, delta, rest, static_cast<uint64_t> (powersOf10[numDigits]) << -one.exponent, mantissaDiff);
152 return length;
153 }
154
155 if (numDigits == 0)
156 {
157 for (;;)
158 {
159 delta *= 10;
160 p2 *= 10;
161 --numDigits;
162 writeDigitIfNotLeadingZero (buffer, length, static_cast<uint32_t> (p2 >> -one.exponent));
163 p2 &= one.mantissa - 1;
164
165 if (p2 < delta)
166 {
167 K += numDigits;
168 roundFinalDigit (buffer, length, delta, p2, one.mantissa, numDigits > -9 ? mantissaDiff * powersOf10[-numDigits] : 0);
169 return length;
170 }
171 }
172 }
173 }
174 }
175
176 static void roundFinalDigit (char* buffer, uint32_t length, uint64_t delta, uint64_t rest, uint64_t tenToPowerNumDigits, uint64_t diff)

Callers

nothing calls this directly

Calls 1

getNumDecimalDigitsFunction · 0.85

Tested by

no test coverage detected