log10
возвращает число с плавающей запятой (double). Значение log10
не является точно представимым в плавающей точке для большинства передаваемых вами чисел, поэтому вы можете получить что-то вроде log10(8)/log10(2) == 2.9999999
вместо точного 3
. Преобразование в int
усекает его до 2
. Чтобы исправить это, вы должны правильно округлить:
int x = lrint(log10(numero)/log10(2));
Или, если у вашего компилятора нет функции lrint
, которую вы можете использовать:
int x = log10(numero)/log10(2) + 0.5;
, который будет работать для этого случая.
Обратите внимание, что существуют альтернативные способы расчета желаемого результата. Поскольку числа с плавающей запятой уже хранят показатель степени в базе 2, вы можете получить его с помощью вызова frexp
:
int x;
frexp(numero, &x);
Другим способом было бы вообще избежать математики с плавающей запятой и использовать внутреннюю для получения индекса последнего бита, установленного в numero
. К сожалению, нет кроссплатформенного способа сделать это.