2014-10-15 3 views
0

Мне нужно разработать математическую библиотеку, используя арифметику с фиксированной точкой. Мне нужно протестировать эту библиотеку.Как протестировать библиотеку с фиксированной точкой?

Для тестирования, мне нужно сделать следующее:

  1. чтения числа с плавающей точкой.
  2. Преобразовать его в фиксированной точке числа
  3. ли все операции с использованием фиксированных арифметика
  4. результат Преобразовать в число с плавающей точкой
  5. записи о/р (с плавающей точкой

Но я не хочу использовать float/double в моих тестовых примерах. Итак, как я буду выполнять шаги 1 и 5?

ответ

1

Целочисленный ввод, очевидно, легко выполняется без плавающих точек. Если вы не знаете, как сделать , что, пожалуйста, прочитайте вопросы на этом сайте о том, как это сделать (или изучите первую часть этой функции). Десятичные числа относительно просты в общем смысле, просто продолжайте чтение как целое число, но отслеживайте, сколько цифр вы читаете после десятичной дроби, а затем разделите входное значение на 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, поэтому очень важно иметь ограничение на вывод цифр.

Смежные вопросы