2015-07-13 4 views
-2
/* 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?

+2

'~' = побитовое НЕ, '<<' left shift, '&' побитовое И, '>>' right shift ... –

+0

Я точно знал эти и то, что каждый шаг вычисляет, но не может узнать, что это возвращается, даже с комментариями на английском языке. (Извините за плохое понимание английского языка). – ggaaooppeenngg

+1

Это, по-видимому, немного своеобразный декодер для пользовательского бинарного формата с плавающей запятой, как и IEEE-754, за исключением всех усложняющих особых случаев. Чтобы быть конкретным, он разбивает 'x' на два битовых поля, а' fract_bits' определяет ширину нижней части. Верхняя часть интерпретируется как показатель степени два, а нижняя часть интерпретируется как фракция с фиксированной точкой (мантисса). Затем он умножает эти два вместе с имплицитным. Google для наполовину плавающих декодеров, и вы, вероятно, найдете соответствующие объяснения основных принципов. – doynax

ответ

0

После подсказок от @doynax и ссылки на эту ссылку, https://en.wikipedia.org/wiki/Half-precision_floating-point_format.

Я понял, как это работает.

A x образован 2 частями, один (высокая часть x >>= fract_bits в этой функции) является экспонентой (pow of 2), а один (нижняя часть fract = x & ~(~0 << fract_bits) в этой функции) является фракционной частью (также pow of 2). Если высокая часть - это все нули, она неявно представляет 1 (x = 1<<x). Таким образом, финальная часть x += (x * fract) >> fract_bits означает 1 + мантисса * экспоненциальная часть. Это метод кодирования точки с плавающей точкой с типом данных 2 байта.