Что такое переполнение и переполнение в плавающей точке

Я чувствую, что я не очень понимаю концепцию overflowи underflow. Я задаю этот вопрос, чтобы прояснить это. Мне нужно понять это на самом базовом уровне с битами. Давайте работать с упрощенным представлением с плавающей запятой 1байт- 1битового знака, 3показателем 4битов и битами мантиссы:

0 000 0000

Максимальным показателем, который мы можем сохранить, является 111_2=7минус смещение, K=2^2-1=3которое дает 4, и оно зарезервировано для Infinityи NaN. Показатель для максимального числа равен 3, который находится 110в смещенном двоичном формате.

Таким образом, бит-шаблон для максимального числа:

0 110 1111 // positive
1 110 1111 // negative

Когда показатель степени равен нулю, число является субнормальным и 0вместо него подразумевается 1. Таким образом, бит-шаблон для минимального номера:

0 000 0001 // positive
1 000 0001 // negative

Я нашел эти описания для плавающей точки с одинарной точностью:

Negative numbers less than ?(2?2?23) ? 2127 (negative overflow)
Negative numbers greater than ?2?149 (negative underflow)
Positive numbers less than 2?149 (positive underflow)
Positive numbers greater than (2?2?23) ? 2127 (positive overflow)

Из них я понимаю только положительное переполнение, которое приводит к тому +Infinity, и пример будет таким:

0 110 1111 + 0 110 1111 = 0 111 0000 

Может ли кто-нибудь продемонстрировать три других случая переполнения и недоиспользования, используя описанные выше битовые шаблоны?

javascript,floating-point,ieee-754,

1

Ответов: 1


2 принят

Конечно, следующее зависит от реализации, но если числа ведут себя как что-то вроде того, что указывает IEEE-754, числа с плавающей запятой не переполняются и не переполняются до дико неправильного ответа, например, целые числа, например, вы действительно не должны заканчивать двумя положительными числами, умноженное на отрицательное число.

Вместо этого переполнение означает, что результат «слишком велик для представления». В зависимости от режима округления это либо обычно получает макс. Float (RTZ), либо Inf (RNE):

0 110 1111 * 0 110 1111 = 0 111 0000

(Обратите внимание, что переполнение целых чисел, как вы знаете, могло быть устранено на аппаратном обеспечении, применяя аналогичную операцию зажима, это просто не соглашение.)

При работе с числами с плавающей запятой термин underflow означает, что число «слишком мало для представления», что обычно приводит к 0,0:

0 000 0001 * 0 000 0001 = 0 000 0000

Обратите внимание, что я также слышал, что термин underflow используется для переполнения до очень большого отрицательного числа, но это не лучший термин для него. Это пример того, когда результат отрицательный и слишком большой для представления, т. Е. «Отрицательное переполнение»:

0 110 1111 * 1 110 1111 = 1 111 0000
JavaScript, с плавающей точкой, IEEE-754,
Похожие вопросы