Если вы хотите оценить все входные мощности, равные двум, я бы использовал двойное значение в качестве входного значения, чтобы получить показатель степени меньше нуля (0,5, 0,25 и т. Д.).
С этой целью из-зак тому факту, что двойные числа выражаются в формате с плавающей запятой двойной точности (как определено в стандарте IEEE 754-2008), вам следует только проверить, что нормализованная дробь получена после разложения числа с помощью std :: frexp (https://en.cppreference.com/w/cpp/numeric/math/frexp) равно 0,5:
#include <cmath>
bool isPowerOfTwo(double a)
{
int exp;
return std::frexp(a, &exp) == 0.5;
}
Тогда код:
#include <cmath>
#include <iostream>
bool isPowerOfTwo(double a)
{
int exp;
return std::frexp(a, &exp) == 0.5;
}
int main() {
unsigned counter = 0;
while (true) {
double input;
std::cin >> input;
if (!isPowerOfTwo(input)) {
break;
}
counter++;
}
std::cout << "Number of inputs power of 2: " << counter << std::endl;
return 0;
}