Целочисленный ввод, очевидно, легко выполняется без плавающих точек. Если вы не знаете, как сделать , что, пожалуйста, прочитайте вопросы на этом сайте о том, как это сделать (или изучите первую часть этой функции). Десятичные числа относительно просты в общем смысле, просто продолжайте чтение как целое число, но отслеживайте, сколько цифр вы читаете после десятичной дроби, а затем разделите входное значение на 10^digit_count. Легко.
fixed_point input(source)
{
fixed_point value = 0;
fixed_point shift = 1;
char nextchar;
//read integer part
while(nextchar = source.get_next() && nextchar>='0' && nextchar<='9') {
auto digit = nextchar-'0';
value = value * base + digit;
}
//if there's a decimal...
if (nextchar == '.') {
//then read the fractional part
while(nextchar = source.get_next() && nextchar>='0' && nextchar<='9') {
auto digit = nextchar-'0';
value = value * base + digit;
shift = shift * 10;
}
//at this point, if input was "123.456"
//we have a value of "123456",
//and a shift of 1000. Simple division.
value /= shift;
}
return value;
}
и выход:
void output(sink, fixed_point value) {
fixed_point exponent = 1;
//find largest base10 exponent that's less than value
{
fixed_point check_exponent = exponent *10;
while(check_exponent >= fixed_point) {
exponent = check_exponent;
check_exponent = exponent *10;
}
}
//write integer part
do {
sink.write(int(value)/exponent +'0');
value -= int(value)/exponent*exponent;
exponent /= 10;
} while(exponent > 0);
//if there's a fraction
if (value > 0) {
sink.write('.');
int max_digits = 6; //or something
//write up to 6 digits
while(value>0 && max_digits) {
value *= 10;
sink.write(int(value));
value -= int(value);
max_digits -= 1;
}
}
}
Обратите внимание, что этот код elides много мелких деталей, такие как тип цифр, негативы, как source.get_next() работает, и переливы. Также обратите внимание, что в реальном коде вы хотите source.peek()
(или эквивалент), и только потребляете символ, если это цифра или .
, поэтому вы оставляете конечные недопустимые цифры в исходном буфере. Ничто из этого не приближается к компиляции и, вероятно, имеет много семантических ошибок и недочетов, даже если оно скомпилировалось. Обратите внимание, что в зависимости от вашей базы выход может содержать бесконечные цифры в базе 10, поэтому очень важно иметь ограничение на вывод цифр.