Jump to content
    

Помогите разобраться в half floating point

Всем доброго дня.
Пытаюсь понять, как сделан перевод из float в half (16-битный float). Есть неясный момент. Вот код:
 

            bits<float>::type fbits;// Value - это флоат, который преобразовываем в half
            std::memcpy(&fbits, &value, sizeof(float));
        #if 1
            unsigned int sign = (fbits>>16) & 0x8000;//выделяем знак
            fbits &= 0x7FFFFFFF;	//оставляем все остальное
            if(fbits >= 0x7F800000)  //проверяем число на бесконечность или NaN
                return sign | 0x7C00 | ((fbits>0x7F800000) ? (0x200|((fbits>>13)&0x3FF)) : 0);
            if(fbits >= 0x47800000)	  //Если порядок больше максимального для half (т.е. 16: 0x478 - это порядок 143, приводя к "нормальному" порядку получим 143-127 = 16)- переполнение 
                return overflow<R>(sign);
            if(fbits >= 0x38800000)	//Если порядок больше мин. для half (т.е. -14: 0x388 это порядок 113, приводя к "нормальному" получим 113-127=-14)- переводим в нормализованный half
                return rounded<R,false>(sign|(((fbits>>23)-112)<<10)|((fbits>>13)&0x3FF), (fbits>>12)&1, (fbits&0xFFF)!=0);
            if(fbits >= 0x33000000) //Если порядок больше 102 (т.е. приводя к "нормальному" получим 102-127=-25) ??? откуда взялся порядок -25 ???
            {		
                int i = 125 - (fbits>>23);	//Преобразоование к денормализованному числу half
                fbits = (fbits&0x7FFFFF) | 0x800000;
                return rounded<R,false>(sign|(fbits>>(i+1)), (fbits>>i)&1, (fbits&((static_cast<uint32>(1)<<i)-1))!=0);
            }
            if(fbits != 0)
                return underflow<R>(sign);
            return sign;

Непонятен случай денормализованных чисел. почему порядок -25? Откуда он взялся?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...