Массивы всегда используют линейное, целочисленное и n + 1 степпинг. Поэтому вам нужно сопоставить логарифмическую шкалу с линейным индексом. Это можно сделать либо просто используя log (log_index), либо таблицу диапазонов, и линейный поиск. Для log() могут быть приближения, которые лучше всего соответствуют вашим потребностям и быстрее, чем функция полного логарифма (float).
Вы могли бы, например, принимать количество верхнего 1-бита в лог-индекса и использовать следующие п младшие биты в диапазоне индекса:
// all vars are size_t (unsigned at least!)
base_index = get_number_of_uppermost_bit(log_index);
shift = (base_index > 3U) ? (base_index - 3U) : 0;
lin_index = base_index * 8U + ((log_index >> shift) & (8U-1U);
Значения 8 и 3 (LD (8)) - количество записей в лог-диапазоне. Обратите внимание, что они являются линейными (иногда приемлемое приближение). Вы также можете применить алгоритм к младшим битам, но получая функцию целочисленного журнала. Но выше это быстрее и может быть достаточно. В качестве альтернативы вы можете использовать таблицу поиска для младших 3 бит. Десятичный степпинг был бы более сложным и довольно неэффективным.