Ожидается, что новая версия стандарта (C++0x) последует за стандартом C99 и предусмотрит тип
long long
, размер которого будет, по крайней мере, не меньше размера
long int
, а возможно, и больше. Несмотря на это, всегда будут случаи, когда требуется наличие целочисленного типа, размер которого превышает размер самого большого встроенного типа.
Представленная здесь реализация основана на двоичном представлении чисел при помощи класса
bitset
, причем это делается за счет некоторого снижения производительности. Однако я потерял в производительности
значительно меньше, чем выиграл в простоте. Более эффективная реализация чисел произвольной точности настолько обширна, что могла бы легко заполнить всю книгу.
Смотри также
Рецепт 11.19.
11.21. Реализация чисел с фиксированной точкой
Проблема
Требуется обеспечить выполнение вычислений с вещественными числами, используя тип с фиксированной, а не с плавающей точкой.
Решение
В примере 11.40 представлена реализация вещественного числа с фиксированной точкой, когда количество двоичных позиций справа от точки задается параметром шаблона. Например, тип
basic_fixed_real<10>
имеет 10 двоичных цифр справа от двоичной точки, что позволяет представлять числа с точностью до 1/1024.
Пример 11.40. Представление вещественных чисел, используя формат с фиксированной точкой
Программа примера 11.40 выдает следующий результат.
6.25
Обсуждение
Число с фиксированной точкой, как и число с плавающей точкой, является приблизительным представлением вещественного числа. Число с плавающей точкой имеет мантиссу (m) и экспоненту (е), обеспечивая значение, вычисляемое по формуле m*bе, где b — некоторая константа.
Число с фиксированной точкой имеет почти такой же формат, но здесь экспонента также фиксирована. Эта константа в примере 11.40 передается шаблону
basic_fixed_real
в качестве его параметра.
Представление экспоненты е в виде константы позволяет реализовать числа с фиксированной точкой с помощью целых типов и выполнять арифметические операции с ними, используя целочисленную арифметику. Во многих случаях это может повысить скорость выполнения основных арифметических операций, особенно сложения и вычитания.
Представление с фиксированной точкой менее гибко, чем представление чисел с плавающей точкой, так как оно обеспечивает только узкий диапазон значений. Приведенный в примере 11.40 тип
fixed_real
позволяет представлять значения только в диапазоне от -2 097 151 до +2 097 151 с точностью 1/1024.
Сложение и вычитание чисел с фиксированной точкой реализуется достаточно естественно: я просто складываю или вычитаю их целочисленные представления. Для выполнения деления и умножения требуется дополнительная операция сдвига мантиссы влево или вправо, чтобы двоичная точка заняла правильную позицию.