Pow не работает, как ожидалось, в C++
Привет всем, я работаю довольно долго с C++, и это проблема, которая беспокоит меня.
Я пытаюсь оценить pow(2,30), но ответ приходит примерно так: 1.07374e+009 вместо ожидаемой целочисленной формы 1073741824. Я пытался привести его к типу int или long, но дело в том, что иногда его усекает до более низкое значение. Например, 1073741824 иногда усекается до 1073741823. Что мне делать? Кроме того, если число не равно 2, как следует убедиться, что ответ получен в правильном формате.
2 ответа
Если вы уверены, что всегда вычисляете степень 2. Лучше использовать оператор сдвига влево, поскольку он очень эффективен по сравнению с функцией pow(). Посмотрите этот фрагмент. Это работает как шарм.
#include <iostream>
int main()
{
long pow_value = (1L << 30); //Equivalent to calculating 2^30
printf("%ld",pow_value);
return 0;
}
pow()
работает только с числами с плавающей запятой, и когда вы выводите большое число с плавающей запятой, <<
Оператор автоматически печатает его в научной записи. Преобразование в целочисленный тип не будет работать, потому что числа с плавающей запятой не являются точными на 100% и имеют ошибку с плавающей запятой.
Если вам нужны только степени 2, вы можете использовать сдвиг битов. a << b
эквивалентно a
раз 2 к b
сила Сдвиг чего-либо влево умножает это на степень 2 в двоичном виде, точно так же, как перемещение десятичной точки умножает число на 10 в десятичном виде. Если вам нужны полномочия с другими базами, вы можете использовать что-то из этого поста.