Как преобразовать значение 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;
}
Bignum
пытается представить произвольно большие значения. Диапазон значений, которые может представлятьdouble
, ограничен. Как вы ожидаете, что преобразование будет работать, еслиBignum
представляет значение больше, чем может хранитьdouble
? Как вы ожидаете, что умножение значений будет работать? - person Peter   schedule 07.04.2016Bignum
, а не для двойных? Почему бы не использовать gmp -get_d()
довольно просто и хорошо документировано. - person Floris Velleman   schedule 07.04.2016stod
, возвращая 0.0, если не получится. - person Floris Velleman   schedule 07.04.2016double
потеряет всю дополнительную точность, которую дает вам Bignum. Если вы выберете этот подход, вы можете просто использовать удвоения для всего. - person pcarter   schedule 07.04.2016double operator()(const Bignum& num){return /*convert to double as you like*/; }
? - person Teivaz   schedule 07.04.2016