Как мне избежать научной нотации для больших чисел? - PullRequest
22 голосов
/ 05 ноября 2008

Я делаю 2 ^ 1000, и я получаю это:

1.07151e + 301

Есть ли способ действительно превратить это в правильное число без e + 301, или, по крайней мере, кто-нибудь может показать мне, где я могу увидеть, как превратить это в реальное число, каким-то образом работая с e + 301 часть?

Ответы [ 8 ]

13 голосов
/ 05 ноября 2008

Существует практический предел того, насколько большим может быть число, с которым можно напрямую работать в машинных регистрах. если вы используете числа с плавающей запятой двойной точности, то в общей сложности 64 бита, некоторые из которых посвящены мантиссе, некоторые - экспоненте, а 1 - знаку.

2 ^ 1000 необходимо представить 1001-битное целое число без потери точности. Для работы с такими числами вам нужно использовать библиотеку с поддержкой больших чисел, такую ​​как GNU MP .

10 голосов
/ 05 ноября 2008

Итак, я думаю, что вы действительно хотите просто умение напечатать это без научной записи. Если вы используете printf, то вы хотите:

printf( "%f1000.0", value );
// note that 1000 is way larger than need be,
// I'm just too lazy to count the digits

С cout, попробуйте что-то вроде:

cout.setf(ios::fixed);
cout << setprecision(0) << value;

Если вы хотите напечатать его как степень двух (2 ^ 1000 против 10715 ...), вы сами по себе.

10 голосов
/ 05 ноября 2008

Вам необходимо использовать класс чисел, специально разработанный для длинных чисел.

Чтобы представить 2 ^ 1000 как точное число, тогда по определению вам нужен числовой формат, который на самом деле содержит 1001 двоичных битов. Самый длинный нормальный примитивный целочисленный формат обычно составляет всего 64 бита.

Кстати, ответ:

% perl -Mbigint -e 'print 2**1000'
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376
4 голосов
/ 05 ноября 2008

Если вы хотите сделать это самостоятельно в C ++, вы можете, например, создать массив цифр и выполнить вычисления самостоятельно. Протестированный и проверенный пример:

unsigned int result[400]; // result digits
unsigned int i, j, carry;

// Initialize result digits
for (i = 0; i < 399; i++) {
  result[i] = 0;
}
result[399] = 2;

for (i = 2; i <= 1000; i++) { // Calculate 2^i
  carry = 0;
  for (j = 399; j > 0; j--) {
    result[j] <<= 1;    // multiply with 2
    result[j] += carry; // add carry
    carry = result[j] / 10;
    result[j] %= 10;    // we want one digit (0-9) only
  }
}

printf("2 ^ 1000 = ");
// print result digits
for (i = 0; i < 400; i++) {
  if (result[i] != 0) { // no leading zeros, please
    for (j = i; j < 400; j++) {
      printf("%d", result[j]);
    }
    break;
  }
}
printf("\n");
2 голосов
/ 05 ноября 2008

Один вариант, если логика вашего приложения позволит это изменить единицы, которыми вы манипулируете ....

Если вы измеряете расстояние от Нью-Йорка до Парижа в Ангстремах, выберите вместо этого Мили или Километры .... За исключением чисто математических требований (таких как, например, факторизация простых чисел для криптологии или ... исследования гипотезы Реймана), редко требуется сохранять такое количество цифр точности.

С другой стороны, если вы делаете что-то, что требует совершенно точных целочисленных значений с таким количеством цифр, то вам, вероятно, следует приобрести специализированное программное обеспечение, предназначенное для обработки больших чисел ... Такое программное обеспечение определенно доступно, хотя я не знакомы с этой областью. (затраты, поставщики, возможности и т. д.) Если стоимость - это проблема, и вы думаете о том, чтобы написать ее самостоятельно, я не знаю достаточно о том, что в нее входит, чтобы понять, стоит ли этот подход усилий ...

2 голосов
/ 05 ноября 2008

cout << fixed << your_number; </p>

Но это, вероятно, не покажет целое число. Как кто-то сказал ранее, вам нужно написать класс.

0 голосов
/ 05 марта 2018

Включите заголовок limits.h и cmath.h

cout.precision(0);
cout<< fixed<< pow(2,31);               //OR ANY NUMBER HERE

Используйте cout.precision для установки точности.

0 голосов
/ 05 ноября 2008

Вы получаете настолько точное число, сколько может поддерживать тип переменной. Это число порядка 1, за которым следуют 301 ноль. Чтобы получить точное число, вам нужно работать с библиотекой, которая поддерживает большие числа, или работать с языком, созданным для такого рода математики (maple, matlab и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...