Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...
Здравствуйте, SeaDoG, Вы писали:
SDG>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...
Создать свой — да без проблем! 10^100 < 2^334 < 256^42 — т.е. 42-байтное целое. Если тебе нужно именно целое.
Я сам никогда не пользовался, поэтому наобум — http://www.swox.com/gmp/ Gnu Multi Precision arithmetic library.
Здравствуйте, SeaDoG, Вы писали:
SDG>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...
Вообще-то С++Билдер в long double помещает 10^4932
Или тебе целое нужно?
Тогда можно реализовать класс с использованием вектора...
class LongLong
{ public:
// Конструкторы
LongLong(const string &s); // инициализация строкой
LongLong(const long &number=0);
// операции c с присваиванием
LongLong& operator+=(const LongLong &r);
LongLong& operator-=(const LongLong &r);
LongLong& operator*=(const LongLong &r);
LongLong& operator/=(const LongLong &r);
LongLong& operator%=(const LongLong &r);
// операции без присваиванияfriend LongLong operator+(const LongLong &l, const LongLong &r);
friend LongLong operator-(const LongLong &l, const LongLong &r);
friend LongLong operator*(const LongLong &l, const LongLong &r);
friend LongLong operator/(const LongLong &l, const LongLong &r);
friend LongLong operator%(const LongLong &l, const LongLong &r);
// ввод – выводfriend istream& operator>>(istream &is, LongLong &r);
friend ostream& operator<<(ostream &os, const LongLong &r);
private:
vector<char> v;
};
//Листинг 11.18. Конструктор инициализации длинного целого
LongLong::LongLong(const long &number)
{ long t = number, i = 0;
char digit;
while(t>0)
{ digit = t % 10;
v.push_back(digit);
t/=10; i++;
}
}
//Листинг 11.19. Метод сложения с присваиванием
LongLong& LongLong::operator+=(const LongLong &r)
{ typedef vector<char>::size_type sizeT;
sizeT size = (v.size()>r.v.size())?v.size():r.v.size(); // большая длинаunsigned carry = 0, sumDigit; // перенос и цифра суммы
LongLong Summa; // результат-суммаfor(sizeT i = 0; i < size; i++)
{ sumDigit = digit(i) + r.digit(i) + carry;
carry = sumDigit/10; // вычисляем новый перенос
Summa.v.push_back(sumDigit%10); // добавляем цифру в сумму
}
if (carry) Summa.v.push_back(carry); // добавляем последний перенос
v = Summa.v;
return *this;
}
LongLong operator+(const LongLong &l, const LongLong &r)
{ LongLong tmp = l; tmp+=r; return tmp; }
// вывод
ostream& operator<<(ostream &os, const LongLong &r)
{ for(int i = 0; i < r.v.size(); i++)
os << int(r.v[r.v.size()-i-1]); // вывод в обратном порядкеreturn os;
}
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Здравствуйте, SeaDoG, Вы писали:
SDG>>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо... LVV>Вообще-то С++Билдер в long double помещает 10^4932
Очень полезно, а точность?
LVV>Или тебе целое нужно? LVV>Тогда можно реализовать класс с использованием вектора...
Только тогда, если важна скорость вычислений, а не скорость вывода в десятичном виде в поток, числа лучше хранить в 256-ичной системе.
Здравствуйте, SeaDoG, Вы писали:
SDG>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...
Вариант 1.
struct VeryBigNumber
{
int i;
};
Собственно всё.
Пример использования — функция вывода на консоль:
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, LaptevVV, Вы писали:
LVV>>Здравствуйте, SeaDoG, Вы писали:
SDG>>>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо... LVV>>Вообще-то С++Билдер в long double помещает 10^4932
_DA>Очень полезно, а точность?
Точность нормальная. А вот в MSVC6 sizeof(long double) == 8
А вот в Linux 2.4-21, gcc 3.3 sizeof(long double) == 12
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Здравствуйте, Ubivetz, LVV>>>Вообще-то С++Билдер в long double помещает 10^4932
_DA>>Очень полезно, а точность? U>Точность нормальная.
Под целую часть отведено 64 бита (включая знаковый). Т.е. эквивалентно long long или int64_t
U>А вот в MSVC6 sizeof(long double) == 8 U>А вот в Linux 2.4-21, gcc 3.3 sizeof(long double) == 12
Интересно, как это gcc обрабатывает 12ти байтные, если x87 поддерживает максимум 10ти
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, VoidEx, Вы писали:
VE>Здравствуйте, remark, Вы писали:
VE>10 в 1000 степени, а не 10 и 1000.
Я так и храню. 10 в 1000 степени.
Компьютер не хранит числа, он хранит только представление. Вся соль в том как их интерпретировать.
Любой набор бит может представлять любое число. Вопрос в том, что и как потом делать с этим представлением.
Здравствуйте, gear nuke, Вы писали:
U>>А вот в MSVC6 sizeof(long double) == 8 U>>А вот в Linux 2.4-21, gcc 3.3 sizeof(long double) == 12
GN>Интересно, как это gcc обрабатывает 12ти байтные, если x87 поддерживает максимум 10ти
Не уверен, но где-то слышал, что 2 байта там для выравнивания и являются незначащими. Пусть специалисты по gcc поправят, если не так.
Здравствуйте, Ubivetz, Вы писали:
U>Здравствуйте, _DAle_, Вы писали:
_DA>>Здравствуйте, LaptevVV, Вы писали:
LVV>>>Здравствуйте, SeaDoG, Вы писали:
SDG>>>>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо... LVV>>>Вообще-то С++Билдер в long double помещает 10^4932
_DA>>Очень полезно, а точность? U>Точность нормальная. А вот в MSVC6 sizeof(long double) == 8 U>А вот в Linux 2.4-21, gcc 3.3 sizeof(long double) == 12
Это не позволяет хранить 1000 значащих цифр. И не вижу особых причин цирк из вопроса устраивать.