static double parse_decimal(const char *str, char **endptr) { double result = 0, d = 1; result += parse_number(str, endptr); if (**endptr == '.') { ++(*endptr); while (isdigit(**endptr)) ++(*endptr), d *= 10; result += digits_to_num(*endptr - 1) / d; } return result * parse_e_format(*endptr, endptr); }
static bool cancel_digit (int nom, int denom, int N) { int nom_digits[N]; int denom_digits[N]; fill_digits (nom_digits, nom); fill_digits (denom_digits, denom); bool nom_trailing_zero = true; for (int i = 0; i < N; i++) { if (nom_digits[i] != 0) nom_trailing_zero = false; if (nom_trailing_zero) continue; bool denom_trailing_zero = true; for (int j = 0; j < N; j++) { if (denom_digits[j] != 0) denom_trailing_zero = false; if (denom_trailing_zero) continue; if (nom_digits[i] == denom_digits[j]) { int new_nom = digits_to_num (nom_digits, N, i); int new_denom = digits_to_num (denom_digits, N, j); if (nom * new_denom == denom * new_nom) return true; } } } return false; }
static double parse_number(const char *str, char **endptr) { while (isdigit(*str)) ++str; /* Pointer to the end of the parsed part. */ *endptr = (char*)str--; return digits_to_num(str); }