Подтвердить что ты не робот

Как избежать научной нотации для больших чисел?

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

1.07151e + 301

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

Спасибо

4b9b3361

Ответ 1

Итак, я думаю, что то, что вы действительно хотите, это просто возможность напечатать его без научной нотации. Если вы используете 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...), вы сами по себе.

Ответ 2

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

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

Ответ 3

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

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

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

% perl -Mbigint -e 'print 2**1000'
10715086071862673209484250490600018105614048117055336074437503883703510511249361224931983788156958581275946729175531468251871452856923140435984577574698574803934567774824230985421074605062371141877954182153046474983581941267398767559165543946077062914571196477686542167660429831652624386837205668069376

Ответ 4

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

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");

Ответ 5

cout < фиксированный < your_number;

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

Ответ 6

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

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

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

Ответ 7

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