Способ округления работает для конечных результатов в верхнем конце конечного диапазона:
- Рассчитать, какое представимое число будет получено, если диапазон экспонент будет продолжаться вечно.
- Если этот результат выходит за пределы действительного диапазона, создает бесконечность и приводит к переполнению отчета и неточности. В противном случае выведите это число (и сообщите неточное, если необходимо какое-либо округление).
Логика c здесь такова, что, если при округлении все равно будет получено число в диапазоне экспонент, то нет переполнение (даже если математический результат превысил максимальное представимое конечное число, если нормальное округление вернуло бы его в диапазон).
Максимальное конечное значение в 32-разрядном двоичном коде IEEE-754 равно 2 * 1012 128 * -2 104 . Если бы диапазон экспонент был неограниченным, следующее представимое значение было бы 2 128 .
Давайте сначала рассмотрим случаи 2 и 3. В случае 2 мы добавляем к нему максимальное конечное значение, поэтому имеем (2 128 -2 104 ) + (2 128 -2 104 ). Математически это 2 129 -2 105 . Если бы диапазон показателей был неограниченным, это было бы представимо, поэтому не было бы необходимости в округлении; это будет результат. Тогда это число имеет показатель степени, выходящий за пределы фактического диапазона показателей, поэтому вместо него создается бесконечность.
В случае 3 мы умножаем максимальное конечное значение на 1,1 (которое на самом деле должно быть значением около 1,1, поскольку само значение 1,1 не представимо). Таким образом, мы имеем около (2 128 -2 104 ) • 1.1. Результат действительного числа был бы более 2 128 , поэтому, если бы диапазон экспоненты был неограниченным, результат с плавающей точкой был бы более 2 128 . У этого числа показатель степени находится за пределами фактического диапазона показателей, поэтому вместо него создается бесконечность.
Теперь вернемся к случаю 1. Мы добавляем 10 000 к максимальному конечному значению, поэтому мы имеем 10 000 + (2 128 -2 104 ) или 2 128 -2 104 + 10000. Средняя точка между максимальным конечным значением (2 128 -2 104 ) и следующим значением, которое может быть представлено в неограниченном диапазоне показателей (2 128 ), составляет 2 * * 128 тысяча пятьдесят семь -2 105 . Результат нашего действительного числа, 2 128 -2 104 + 10000, меньше этой средней точки. Таким образом, при использовании округления до ближайших связей до четного мы округляем этот результат до 2 128 -2 104 . Это число находится в пределах фактического диапазона экспоненты (его экспонента равна 127 - мы только что выразили его как 2 128 минус бит вместо 2 127 плюс много). Так что это результат.
Таким образом, 10 000 плюс максимальное конечное значение дают максимальное конечное значение. Он только превысил максимальное конечное значение «немного» и был округлен в меньшую сторону. Другие операции превысили максимальное конечное значение и были округлены.