alexPec 4 August 8 Posted August 8 · Report post Всем доброго дня. Пытаюсь понять, как сделан перевод из 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? Откуда он взялся? Quote Share this post Link to post Share on other sites More sharing options...