Обратите внимание:
log2 (x) = log (x) * log (e)
где log (e) - константа. math.h
определяет M_LOG2E
до значения log(e)
, если вы определите _USE_MATH_DEFINES
до включения math.h
:
#define _USE_MATH_DEFINES // needed to have definition of M_LOG2E
#include <math.h>
static inline double log2(double n)
{
return log(n) * M_LOG2E;
}
Несмотря на то, что обычно используется log(n)/log(2)
, я бы посоветовал вместо этого использовать умножение, поскольку деление всегда медленнее, особенно для чисел с плавающей запятой и особенно для мобильных процессоров. Например, на современных процессорах Intel разница в сгенерированном коде всего в одной инструкции mulsd против divsd и согласно руководствам Intel мы можем ожидать, что деление будет 5 В 10 раз медленнее. В процессорах ARM для мобильных устройств я бы ожидал, что деление с плавающей запятой будет где-то на 10-100 медленнее, чем умножение.
Кроме того, в случае, если у вас есть проблемы с компиляцией с log2
для Android, похоже, что log2 доступен в заголовках, начиная с android-18:
#include <android/api-level.h>
#if __ANDROID_API__ < 18
static inline double log2(double n)
{
return log(n) * M_LOG2E;
}
#endif