Округление обычно выполняется до ближайшей более значимой цифры. Но если значение точно между ними, т. Е. Если старший бит, от которого вы хотите избавиться, равен 1, а остальные равны 0, существует несколько так называемых правил разрыва связи:
- усечение (к 0)
- вверх (к + бесконечность)
- вниз (в направлении -infinity)
- от 0
- банковское округление (до ближайшего четного более значимого разряда).
Какое правило применяется, это то, что должно быть определено. AFAIK, большинство FPU по умолчанию используют банковское округление.
В нашем случае вы отбрасываете 3 двоичные цифры. 000 просто усекаются; 001-011 всегда округляется вниз; 101-111 всегда округляется вверх, а 100 вызывает правила разрыва связи. Если результатом этих правил является округление, вы добавляете один младший значащий бит к результату и, если необходимо, соответственно смещаетесь.
В первом случае вы просто усекаете биты, так как они меньше 100, но если это значение
1.11010110111100110100011111
и вы хотите удалить 3 бита, сначала оно усекается до
1.11010110111100110100011
но поскольку битов, которые вы выбросили, было 111, вы округлили, поэтому вы добавили 1 бит, и он стал
1.11010110111100110100100
IOW, младшие биты 011 становятся 100