// // Helper functions // char* dtostrf(double number, signed char width, unsigned char prec, char *s) { if(isnan(number)) { strcpy(s, "nan"); return s; } if(isinf(number)) { strcpy(s, "inf"); return s; } if(number > 4294967040.0 || number < -4294967040.0) { strcpy(s, "ovf"); return s; } char* out = s; // Handle negative numbers if(number < 0.0) { *out = '-'; ++out; number = -number; } // Round correctly so that print(1.999, 2) prints as "2.00" double rounding = 0.5; for(uint8_t i = 0; i < prec; ++i) rounding /= 10.0; number += rounding; // Extract the integer part of the number and print it unsigned long int_part = (unsigned long) number; double remainder = number - (double) int_part; out += sprintf(out, "%d", int_part); // Print the decimal point, but only if there are digits beyond if(prec > 0) { *out = '.'; ++out; } while(prec-- > 0) { remainder *= 10.0; } sprintf(out, "%d", (int) remainder); return s; }