BigInt<1024> n(1); // вычислить факториал числа 32
for (int 1=1; i <= 32; ++i) {
n *= i;
}
outputBigInt(n);
}
Программа примера 11.39 выдает следующий результат.
263130836933693530167218012160000000
Большие целые числа часто встречаются во многих приложениях. Например, в криптографии нередки числа, которые представляются 1000 и более битами. Однако современный стандарт C++ позволяет работать как максимум с типом long int
long int
Ожидается, что новая версия стандарта (C++0x) последует за стандартом C99 и предусмотрит тип long long
long int
, а возможно, и больше. Несмотря на это, всегда будут случаи, когда требуется наличие целочисленного типа, размер которого превышает размер самого большого встроенного типа.Представленная здесь реализация основана на двоичном представлении чисел при помощи класса bitset
Рецепт 11.19.
11.21. Реализация чисел с фиксированной точкой
Требуется обеспечить выполнение вычислений с вещественными числами, используя тип с фиксированной, а не с плавающей точкой.
В примере 11.40 представлена реализация вещественного числа с фиксированной точкой, когда количество двоичных позиций справа от точки задается параметром шаблона. Например, тип basic_fixed_real<10>
#include
using namespace std;
template
struct BasicFixedReal {
typedef BasicFixedReal self;
static const int factor = 1 << (E - 1);
BasicFixedReal() : m(0) {}
BasicFixedReal(double d) : m(static_cast
self& operator+=(const self& x) { m += x.m; return *this; }
self& operator-=(const self& x) { m -= x.m; return *this; }
self& operator*=(const self& x) { m *= x.m; m >>=E; return *this; }
self& operator/=(const self& x) { m /= x.m; m *= factor; return *this; }
self& operator*=(int x) { m *= x; return *this; }
self& operator/=(int x) { m /= x; return *this; }
self operator-() { return self(-m); }
double toDouble() const { return double(m) / factor; }
// дружественные функции
friend self operator+(self x, const self& v) { return x += y; }
friend self operator-(self x, const self& y) { return x -= y; }
friend self operator-(self x, const self& y) { return x *= y; }
friend self operator/(self x, const self& y) { return x /= y; }
// операторы сравнения
friend bool operator==(const self& x, const self& y) { return x.m == y.m; }
friend bool operator!=(const self& x, const self& y) { return x.m != y.m; }
friend bool operator>(const self& x, const self& y) { return x.m > y.m; }
friend bool operator<(const self& x, const self& y) { return x.m < y.m; }