fix number printing, rounding bug
Costa Tsaousis (ktsaou) committed
Jan 18, 2018 at 22:56 UTC
f5520355f09ba65cf3693b6b426f0538041f5f7c
1 file changed
+15
-4
src/storage_number.c
+15
-4
@@ -162,6 +162,7 @@ int print_calculated_number(char *str, calculated_number value)
162
*/
163
164
int print_calculated_number(char *str, calculated_number value) {
165
+ // info("printing number " CALCULATED_NUMBER_FORMAT, value);
166
char integral_str[50], fractional_str[50];
167
168
char *wstr = str;
@@ -179,25 +180,34 @@ int print_calculated_number(char *str, calculated_number value) {
180
fractional = ((unsigned long long)(value * 10000000ULL) % 10000000ULL);
181
#endif
182
183
+ unsigned long long integral_int = (unsigned long long)integral;
184
+ unsigned long long fractional_int = (unsigned long long)calculated_number_llrint(fractional);
185
+ if(unlikely(fractional_int >= 10000000)) {
186
+ integral_int += 1;
187
+ fractional_int -= 10000000;
188
+ }
189
+
190
+ // info("integral " CALCULATED_NUMBER_FORMAT " (%llu), fractional " CALCULATED_NUMBER_FORMAT " (%llu)", integral, integral_int, fractional, fractional_int);
191
+
192
char *istre;
183
- if(integral == 0.0) {
193
+ if(unlikely(integral_int == 0)) {
194
integral_str[0] = '0';
195
istre = &integral_str[1];
196
}
197
else
198
// convert the integral part to string (reversed)
189
- istre = print_number_llu_r_smart(integral_str, (unsigned long long)integral);
199
+ istre = print_number_llu_r_smart(integral_str, integral_int);
200
201
// copy reversed the integral string
202
istre--;
203
while( istre >= integral_str ) *wstr++ = *istre--;
204
195
- if(fractional != 0.0) {
205
+ if(likely(fractional_int != 0)) {
206
// add a dot
207
*wstr++ = '.';
208
209
// convert the fractional part to string (reversed)
200
- char *fstre = print_number_llu_r_smart(fractional_str, (unsigned long long)calculated_number_llrint(fractional));
210
+ char *fstre = print_number_llu_r_smart(fractional_str, fractional_int);
211
212
// prepend zeros to reach 7 digits length
213
int decimal = 7;
@@ -216,5 +226,6 @@ int print_calculated_number(char *str, calculated_number value) {
226
}
227
228
*wstr = '\0';
229
+ // info("printed number '%s'", str);
230
return (int)(wstr - str);
231
}