экспоненциальный — (C ++) 2 ^ 32 = 0, но 2 ^ 31 * 2 работает

Поэтому я недавно сделал простой калькулятор на С ++, который, помимо прочего, может вычислять показатели, но он работает только до 2 ^ 31.
Вот проблема, мой ввод / вывод выглядит следующим образом:

I: 2^31
O: 131072

I: 2^32
O: 0

I: 13107*2
O: 262144

В основном это не может сделать 2 ^ 32, но это может сделать (2 ^ 31) * 2, и я просто не могу понять почему. Если кто-нибудь может мне помочь и объяснить, почему я был бы очень признателен. Вот код, который вычисляет показатели между прочим:

long exp(long x, int y) {
int p;

if (y % 2 == 0) {
p = 1;
}
else {
p = x;
}

while (y > 1) {
x *= x;
y /= 2;
}
return x*p;
}

0

Решение

Ваша функция дает неверные результаты даже для небольших чисел.
Рассматривать:

std::cout << exp(2,4); // 16
std::cout << exp(2,5); // 32
std::cout << exp(2,6); // 16 ???

Во-первых, вам нужно исправить реализацию функции, во-вторых, использовать больший тип, который может представлять большие числа:

long long exp(long long x, int y)
{
long long result = x;
while(--y)
{
result*=x;
}
return result;

}

РЕДАКТИРОВАТЬ: обратите внимание, что это работает только для положительных чисел.
Также обратите внимание, что в C ++ нет встроенного «оператора питания». Operator ^ называется оператором XOR, который выполняет побитовую операцию над двумя числами.
Замечания:

int x = 0b101'111; //47
int y = 0b110'010; //50
//x^y = 0b011'101
std::cout << (x^y); //outputs 29

Каждый бит в результате оператора XOR устанавливается в 1, если задан только один из пары бит, в противном случае 0.

x:      0   1   0   1
y:      0   0   1   1

result: 0   1   1   0
3

Другие решения

Превратив «длинный» в «длинный длинный», мне удалось изобразить 2 ^ 32.

Другая проблема, на которую указывали люди, заключалась в том, что 2 ^ 31 неверна, потому что я не учла тот факт, что даже если Y начинается четное позже может стать странный при делении на 2, а затем при повторном погружении на 2 цикл будет на один цикл меньше, чем должен.

Пример: y = 6 >> 6/2 = 3 >> 3/2 = 1

РЕДАКТИРОВАТЬ: Мне удалось это исправить, если кто-то заинтересован, вот как выглядит код:

long long exp(long long x, int y) {
int p = 1;while (y > 1) {
if (y % 2 != 0) {
p *= x;
}
x *= x;
y /= 2;
}
return x*p;
}

Из того, что я видел, похоже, работает.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector