Я использую C++
и я слышал и испытал, что максимальное значение, которое может быть сохранено в int
и long
, одинаково.
Но моя проблема в том, что мне нужно сохранить число, превышающее максимальное значение long
переменной. Размер double
переменной достаточно.
Но проблема заключается в использовании double
переменной, избегая меня с помощью оператора %
который необходим для более легкого кода моей функции, а иногда нет других способов, кроме как использовать его.
Итак, пожалуйста, любезно скажите мне, как достичь моей цели?
Это зависит от цели. Для лучшего ответа дайте нам больше контекста
Взгляните на (unsigned) long long
или GMP
Вы можете использовать тип long long int
или unsigned long long int
Чтобы узнать максимальное значение, которое может содержать тип untegral, вы можете использовать следующую конструкцию, например
std::numeric_limits<long long>::max();
Чтобы использовать его, вы должны включить заголовок <limits>
#include <cmath>
int main ()
{
double max_uint = 4294967295.0;
double max1 = max_uint + 2.0;
double max2 = (max1 + 1.0) * (max_uint + 1.0);
double f = fmod(max2,max1);
return 0;
}
max1
и max2
оба превышают значение unsigned int
limit, а fmod
возвращает правильный результат max2 % max1
, который также превышает предел unsigned int: f == max_uint + 1.0
.
Редактировать:
хороший намек от anatolyg: этот метод работает только для целых чисел до 2 ^ 52. Это связано с тем, что мантисса двойника имеет 52 бит, и каждое высшее целое представляется только с точностью потери. Например, 2 ^ 80 может быть == (2 ^ 80) +1 и == (2 ^ 80) +2 и т.д. Чем выше целые числа, тем выше значение inprecision, потому что там расширяется плотность представляемых целых чисел.
Но если вам просто нужно иметь 20 дополнительных бит по сравнению с int с 32 бит, и у вас нет другой возможности достичь этого со встроенным интегральным типом (с которым обычный процент будет быстрее, я думаю), то вы можете использовать это...
Итак, вы хотите вычислить по модулю больших целых чисел. Вероятно, 99% вы используете шифрование, что сложно. Ваш вопрос подразумевает, что, возможно, вам стоит найти какое-то готовое решение для вашей проблемы на верхнем уровне (шифрование).
В любом случае стандартным ответом является использование библиотеки для целых чисел с большой точностью, таких как GNU MP.
long long
, а не GMP.
вот список некоторых размеров, которые вы ожидаете в C++:
char : 1 byte
short : 2 bytes
int : 4 bytes
long : 4 bytes
long long : 8 bytes
float : 4 bytes
double : 8 bytes
Я думаю, это ясно объясняет, почему вы испытываете трудности и дает вам подсказку о том, как их решить
сначала существует разница между int и длинным типом
но для того, чтобы исправить вашу проблему, вы можете использовать
unsigned long long int