20 assert(bufferLength > 0 && decimalMarkerPosition != 0);
21 char tempBuffer[PrintFloat::k_maxFloatBufferLength];
22 int intLength = i.
writeTextInBuffer(tempBuffer, PrintFloat::k_maxFloatBufferLength);
23 int firstDigitChar = tempBuffer[0] ==
'-' ? 1 : 0;
24 for (
int k = bufferLength-1; k >= firstDigitChar; k--) {
25 if (k == decimalMarkerPosition) {
29 if (intLength > firstDigitChar) {
30 buffer[k] = tempBuffer[--intLength];
35 if (firstDigitChar == 1) {
36 buffer[0] = tempBuffer[0];
42 int numberOfSignificantDigits,
Mode mode) {
43 assert(numberOfSignificantDigits > 0);
44 if (mode == Mode::Default) {
47 char tempBuffer[PrintFloat::k_maxFloatBufferLength];
48 int requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, mode);
54 if (mode == Mode::Decimal && requiredLength >= bufferSize) {
55 requiredLength = convertFloatToTextPrivate(f, tempBuffer, numberOfSignificantDigits, Mode::Scientific);
57 if (requiredLength >= bufferSize) {
58 int adjustedNumberOfSignificantDigits = numberOfSignificantDigits - requiredLength + bufferSize - 1;
59 adjustedNumberOfSignificantDigits = adjustedNumberOfSignificantDigits < 1 ? 1 : adjustedNumberOfSignificantDigits;
60 requiredLength = convertFloatToTextPrivate(f, tempBuffer, adjustedNumberOfSignificantDigits, Mode::Scientific);
62 requiredLength = requiredLength < bufferSize ? requiredLength : bufferSize;
63 strlcpy(buffer, tempBuffer, bufferSize);
64 return requiredLength;
68 int PrintFloat::convertFloatToTextPrivate(
T f,
char * buffer,
int numberOfSignificantDigits,
Mode mode) {
69 assert(mode != Mode::Default);
70 assert(numberOfSignificantDigits > 0);
85 buffer[currentChar++] =
'u';
86 buffer[currentChar++] =
'n';
87 buffer[currentChar++] =
'd';
88 buffer[currentChar++] =
'e';
89 buffer[currentChar++] =
'f';
90 buffer[currentChar] = 0;
96 Mode displayMode = mode;
97 if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Mode::Decimal) {
98 displayMode = Mode::Scientific;
102 int availableCharsForMantissaWithoutSign = numberOfSignificantDigits + 1;
103 int availableCharsForMantissaWithSign = f >= 0 ? availableCharsForMantissaWithoutSign : availableCharsForMantissaWithoutSign + 1;
111 int numberOfDigitBeforeDecimal = exponentInBase10 >= 0 || displayMode == Mode::Scientific ?
112 exponentInBase10 + 1 : 1;
114 T unroundedMantissa = f *
std::pow((
T)10.0, (
T)(availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal));
130 if (f != 0 &&
IEEE754<T>::exponentBase10(mantissa)-exponentInBase10 != availableCharsForMantissaWithoutSign - 1 - numberOfDigitBeforeDecimal) {
135 if ((exponentInBase10 >= numberOfSignificantDigits || exponentInBase10 <= -numberOfSignificantDigits) && mode == Mode::Decimal) {
136 displayMode = Mode::Scientific;
139 int decimalMarkerPosition = exponentInBase10 < 0 || displayMode == Mode::Scientific ?
140 1 : exponentInBase10+1;
141 decimalMarkerPosition = f < 0 ? decimalMarkerPosition+1 : decimalMarkerPosition;
144 int mantissaExponentInBase10 = exponentInBase10 > 0 || displayMode == Mode::Scientific ? availableCharsForMantissaWithoutSign - 1 : availableCharsForMantissaWithoutSign + exponentInBase10;
146 mantissa = mantissa/10;
149 int numberOfCharExponent = exponentInBase10 != 0 ?
std::log10(
std::fabs((
T)exponentInBase10)) + 1 : 1;
150 if (exponentInBase10 < 0){
152 numberOfCharExponent++;
159 int minimumNumberOfCharsInMantissa = 1;
160 while (digit.isZero() && availableCharsForMantissaWithoutSign > minimumNumberOfCharsInMantissa &&
161 (availableCharsForMantissaWithoutSign > exponentInBase10+2 || displayMode == Mode::Scientific)) {
162 mantissa = mantissa/10;
163 availableCharsForMantissaWithoutSign--;
164 availableCharsForMantissaWithSign--;
171 if ((displayMode == Mode::Decimal && availableCharsForMantissaWithoutSign == exponentInBase10+2)
172 || (displayMode == Mode::Scientific && availableCharsForMantissaWithoutSign == 2)) {
173 availableCharsForMantissaWithSign--;
177 assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength);
179 if (displayMode == Mode::Decimal || exponentInBase10 == 0) {
180 buffer[availableCharsForMantissaWithSign] = 0;
181 return availableCharsForMantissaWithSign;
184 assert(availableCharsForMantissaWithSign < PrintFloat::k_maxFloatBufferLength);
186 assert(numberOfCharExponent+availableCharsForMantissaWithSign+1 < PrintFloat::k_maxFloatBufferLength);
188 buffer[availableCharsForMantissaWithSign+1+numberOfCharExponent] = 0;
189 return (availableCharsForMantissaWithSign+1+numberOfCharExponent);
192 template int PrintFloat::convertFloatToText<float>(float,
char*, int, int,
PrintFloat::Mode);
193 template int PrintFloat::convertFloatToText<double>(double,
char*, int, int,
PrintFloat::Mode);
static Preferences * sharedPreferences()
int writeTextInBuffer(char *buffer, int bufferSize) const
void printBase10IntegerWithDecimalMarker(char *buffer, int bufferLength, Integer i, int decimalMarkerPosition)
size_t strlcpy(char *dst, const char *src, size_t len)
int convertFloatToText(T d, char *buffer, int bufferSize, int numberOfSignificantDigits, Mode mode=Mode::Default)
static int exponentBase10(T f)
static Integer Subtraction(const Integer &i, const Integer &j)
static Integer Multiplication(const Integer &i, const Integer &j)
static IntegerDivision Division(const Integer &numerator, const Integer &denominator)