Как избежать научной нотации для больших чисел?
Я делаю 2 ^ 1000 и получаю это:
1.07151e + 301
Есть ли способ превратить это в правильное число без e + 301 или, по крайней мере, может кто-нибудь показать мне, где я могу увидеть, как превратить это в реальное число, каким-то образом работая с e + 301 часть
Спасибо
Ответы
Ответ 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 нули. Чтобы получить точный номер, вам нужно будет работать с библиотекой, поддерживающей большие числа, или работать с языком, созданным для такой математики (клен, матлаб и т.д.).