Преобразование Float32 в Float16 - PullRequest
0 голосов
/ 26 мая 2020

Это скорее продолжение { ссылка }. @sam hocevar или кто-либо другой, кто это понимает: Не могли бы вы объяснить, что здесь происходит:

tmp = (tmp - 0x70) & ((unsigned int)((int)(0x70 - tmp) >> 4) >> 27);

Я не уверен, что полностью следую этому. Я понимаю, что (tmp - 0x70) корректирует смещение 127-> 15, но я не понимаю вторую часть ((unsigned int)((int)(0x70 - tmp) >> 4) >> 27) и поэтому не понимаю & с исправленным смещением на последнем шаге. Спасибо!

1 Ответ

0 голосов
/ 26 мая 2020
(unsigned int)((int)(0x70 - tmp) >> 4) >> 27

эквивалентно 1

(int)(0x70 - tmp) < 0 ? 0x1f : 0

, но гарантированно не задействует ветвь - вместо этого он извлекает знаковый бит из результата извлечения, реплицирует его 4 раз, затем выполняется переключение на пониженную передачу, чтобы получить либо 0x1f, либо 0.


1 В предположении, что сдвиг вправо со знаком отрицательных чисел делает правильную арифметику c сдвиг - - не гарантируется C spe c, но часто встречается в большинстве реализаций

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...