преобразование Bignum в двойной

Как преобразовать значение Bignum в двойное значение и, таким образом, выполнить над ним все обычные артиеметические операции. Я пробую следующий код, но мне кажется глупым делать это таким образом. Итак, я спрашиваю, существует ли оператор Todouble(), который может выполнять эту работу.
Кроме того, мне нужен дополнительный оператор для деления для этих Bignum, и если один из них дает больше операторов для другого basic(+-* ) операций будет лучше. Заранее спасибо.

#include <assert.h>
#include <iomanip>
#include <iostream.h>
#include <stdint.h>
#include <vector>
class Bignum
{
public:
Bignum(int value)
{
    assert(value >= 0 && value <= 999999999);
    parts.push_back(value);
}

Bignum& operator*=(int rhs)
{
    assert(rhs >= 0 && rhs <= 999999999);
    uint32_t carry = 0;
    for (size_t i = 0; i < parts.size(); i++)
    {
        uint64_t product = (uint64_t)parts[i] * (uint64_t)rhs + carry;
        parts[i] = (uint32_t)(product % 1000000000LL);
        carry = (uint32_t)(product / 1000000000LL);
    }
    if (carry != 0)
        parts.push_back(carry);
    return *this;
 }

friend std::ostream & operator<<(std::ostream& stream, const Bignum& num);
private:
std::vector<uint32_t> parts;
};
inline std::ostream& operator<<(std::ostream& stream, const Bignum& num)
{
char oldfill = stream.fill('0');
for (std::vector<uint32_t>::const_reverse_iterator it = num.parts.rbegin();
it != num.parts.rend(); it++)         
    stream << *it << std::setw(9);
stream.fill(oldfill);
stream.width(0);
return stream;
}
Bignum factorial(int n)
{
Bignum fac = 1;
for (int i = 2; i <= n; i++)
    fac *= i;
return fac;
}
int main()
{
double t = factorial (30);
cout<<t<<endl;
}

person Esraa    schedule 07.04.2016    source источник
comment
Предположительно, ваш Bignum пытается представить произвольно большие значения. Диапазон значений, которые может представлять double, ограничен. Как вы ожидаете, что преобразование будет работать, если Bignum представляет значение больше, чем может хранить double? Как вы ожидаете, что умножение значений будет работать?   -  person Peter    schedule 07.04.2016
comment
Что касается операторов, я полагаю, он хочет, чтобы кто-то предоставил ему операторы для Bignum, а не для двойных? Почему бы не использовать gmp - get_d() довольно просто и хорошо документировано.   -  person Floris Velleman    schedule 07.04.2016
comment
@peter, для моего проекта double или long double будет хорошим выбором. для операторов, да, как сказал Флорис, мне нужно, чтобы они выполняли операции с двумя или более Bignums   -  person Esraa    schedule 07.04.2016
comment
@Floris, я не могу установить gmp столько раз, сколько пытаюсь   -  person Esraa    schedule 07.04.2016
comment
@Esraa Попробуйте поискать в Google, многие люди уже делали это раньше (Я на самом деле, хотя и очень дерьмовый (для личного пользования)) - я просто сложил все числа в строку и вызвал stod, возвращая 0.0, если не получится.   -  person Floris Velleman    schedule 07.04.2016
comment
Преобразование в double потеряет всю дополнительную точность, которую дает вам Bignum. Если вы выберете этот подход, вы можете просто использовать удвоения для всего.   -  person pcarter    schedule 07.04.2016
comment
Вы пробовали double operator()(const Bignum& num){return /*convert to double as you like*/; }?   -  person Teivaz    schedule 07.04.2016