log2(x) %% 1 == 0
- проверяет, является ли логическая база 2 числа целым (при делении на 1 остаток равен 0?)
> x = 1:10
> data.frame(x, power2 = log2(x) %% 1 == 0)
x power2
1 1 TRUE
2 2 TRUE
3 3 FALSE
4 4 TRUE
5 5 FALSE
6 6 FALSE
7 7 FALSE
8 8 TRUE
9 9 FALSE
10 10 FALSE
Вышеупомянутое должно работать, но более безопасный подход будет допускают проблемы с точностью с плавающей запятой и могут быть примерно такими:
remainder = log2(x) %% 1
tol = 1e-12 # tolerance
power2 = abs(remainder - round(remainder)) < tol