/* Does linear interpolation between powers of two */
static inline unsigned fract_exp_two(unsigned x, unsigned fract_bits)
{
unsigned fract = x & ~(~0 << fract_bits);
x >>= fract_bits;
x = 1 << x;
x += (x * fract) >> fract_bits;
return x;
}
Я столкнулся с функцией, но я не мог понять, что делает. Какой результат он возвращает? Я пробовал некоторые аргументы, но вряд ли нашел какие-либо подсказки. Есть ли какие-то объяснения?Что делает эта функция fract_exp_two?
'~' = побитовое НЕ, '<<' left shift, '&' побитовое И, '>>' right shift ... –
Я точно знал эти и то, что каждый шаг вычисляет, но не может узнать, что это возвращается, даже с комментариями на английском языке. (Извините за плохое понимание английского языка). – ggaaooppeenngg
Это, по-видимому, немного своеобразный декодер для пользовательского бинарного формата с плавающей запятой, как и IEEE-754, за исключением всех усложняющих особых случаев. Чтобы быть конкретным, он разбивает 'x' на два битовых поля, а' fract_bits' определяет ширину нижней части. Верхняя часть интерпретируется как показатель степени два, а нижняя часть интерпретируется как фракция с фиксированной точкой (мантисса). Затем он умножает эти два вместе с имплицитным. Google для наполовину плавающих декодеров, и вы, вероятно, найдете соответствующие объяснения основных принципов. – doynax