Re: Какой вопрос...
От: remark Россия http://www.1024cores.net/
Дата: 21.05.06 14:43
Оценка: 7 (1) -2 :)))
Здравствуйте, SeaDoG, Вы писали:

SDG>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...



Вариант 1.

struct VeryBigNumber
{
  int i;
};


Собственно всё.
Пример использования — функция вывода на консоль:

int main()
{
  VeryBigNumber n;
  n.i = 1000;
  n.output();
};

struct VeryBigNumber
{
  int i;

  void output()
  {
     std::cout << "10^" << i;
  }
};





Вариант 2.

int i = 38;


Опять всё.

Вот использование на примере вывода на консоль:

void outputVeryBigNumber(int i)
{
  if (38 == i) 
    std::cout << "10^1000";
  else
    std::cout << "error";
}




1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[3]: Какой вопрос...
От: remark Россия http://www.1024cores.net/
Дата: 22.05.06 08:54
Оценка: 1 (1) +1
Здравствуйте, VoidEx, Вы писали:

VE>Здравствуйте, remark, Вы писали:


VE>10 в 1000 степени, а не 10 и 1000.


Я так и храню. 10 в 1000 степени.
Компьютер не хранит числа, он хранит только представление. Вся соль в том как их интерпретировать.
Любой набор бит может представлять любое число. Вопрос в том, что и как потом делать с этим представлением.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
Re[5]: Типы данных
От: vvotan Россия  
Дата: 22.05.06 09:09
Оценка: +1
Здравствуйте, 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 поправят, если не так.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Типы данных
От: SeaDoG  
Дата: 21.05.06 12:56
Оценка:
Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...
Re: Типы данных
От: Кодт Россия  
Дата: 21.05.06 13:40
Оценка:
Здравствуйте, SeaDoG, Вы писали:

SDG>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...


Создать свой — да без проблем! 10^100 < 2^334 < 256^42 — т.е. 42-байтное целое. Если тебе нужно именно целое.

Я сам никогда не пользовался, поэтому наобум — http://www.swox.com/gmp/ Gnu Multi Precision arithmetic library.
Перекуём баги на фичи!
Re: Типы данных
От: LaptevVV Россия  
Дата: 21.05.06 14:25
Оценка:
Здравствуйте, 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;
}
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[2]: Типы данных
От: _DAle_ Беларусь  
Дата: 21.05.06 14:39
Оценка:
Здравствуйте, LaptevVV, Вы писали:

LVV>Здравствуйте, SeaDoG, Вы писали:


SDG>>Можно ли в С++ создать свой тип данных в который например помещалось бы число 10^1000, или может быть подскажите другой способ записать в переменную такое число. Заранее всем спасибо...

LVV>Вообще-то С++Билдер в long double помещает 10^4932

Очень полезно, а точность?

LVV>Или тебе целое нужно?

LVV>Тогда можно реализовать класс с использованием вектора...

Только тогда, если важна скорость вычислений, а не скорость вывода в десятичном виде в поток, числа лучше хранить в 256-ичной системе.
Re[2]: Какой вопрос...
От: VoidEx  
Дата: 21.05.06 21:15
Оценка:
Здравствуйте, remark, Вы писали:

10 в 1000 степени, а не 10 и 1000.
Re[3]: Какой вопрос...
От: kan_izh Великобритания  
Дата: 21.05.06 23:34
Оценка:
VoidEx wrote:

> 10 в 1000 степени, а не 10 и 1000.

Ну тогда так, и не пытайся убедить, что это неправильно:
std::string bigNumber = "10 в 1000 степени, а не 10 и 1000";


ЗЫЖ Формулируй вопрос лучше. Какие именно числа (целое, с плавающей, с фикс. точкой)? Для чего тебе эти числа? Какие
операции хочешь?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Типы данных
От: Ubivetz Украина  
Дата: 22.05.06 06:34
Оценка:
Здравствуйте, _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
Эх, люблю выпить и переспать с кем нибудь!
Но чаще выходит перепить с кем — нибудь и выспаться...
Re[4]: Типы данных
От: gear nuke  
Дата: 22.05.06 08:17
Оценка:
Здравствуйте, 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
Re[4]: Типы данных
От: _DAle_ Беларусь  
Дата: 22.05.06 12:14
Оценка:
Здравствуйте, 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 значащих цифр. И не вижу особых причин цирк из вопроса устраивать.
... << RSDN@Home 1.1.4 beta 7 rev. 447>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.