Сложение вещественных чисел с разными знаками
Пытаюсь понять, как происходит сложение вещественных чисел в формате binary32
(он же single precision
или просто float
в большинстве языков программирования), но немного не понимаю, почему ожидаемый результат отличается от реального.
Есть 2 вещественных числа, которые представлены в формате binary32
стандарта IEEE754
: -987.6543
и 1234.5678
. С самим стандартом ознакомлен, поэтому основные принципы понимаю.
Числа имеют разные порядки, поэтому я изначально поднял порядок числа -987.6543
на одно значение, чтобы порядки обоих операндов были равны. При изменении порядка числа -987.6543
самый младший бит был отсечён, так как при сдвиге вышел за пределы установленной разрядной сетки, а бит нормализации перешёл в дробную часть мантиссы, таким образом, число утратило свою нормализованную форму (числа предварительно записаны в двоичном формате, и все операции выполняются непосредственно в двоичной системе счисления).
Затем я представил отрицательное число в дополнительном коде и просто сложил между собой мантиссы двух чисел. Вот на этом этапе возникает самый первый и основной вопрос. Первое число осталось нормализованным, а второе утратило оный вид, так как значение бита нормализации перешло в хранимую часть мантиссы. По идее, если мы выполняем обычное сложение, то целая часть мантиссы должна быть равна 1
(так как мы складываем значение 0
и 1
), но, очевидно, что логика здесь какая-то другая, так как конечный результат будет иметь совершенно другой порядок, и я просто что-то не так понимаю или не так учёл.
Ну и сама мантисса получилась немного другой после в конечном итоге, так как результат для мантиссы должен быть 11101101110100111011011
, а у меня получается 11101101110100111011000
. Не могу понять природы двух последних единиц, которые располагаются в младших битах мантиссы. Помогите найти ошибку, пожалуйста!
Ход моих действий следующий:
- Представление двух вещественных чисел в формате
binary32
:
- -987.6543 —
1 10001000 11101101110100111100000
- 1234.5678 —
0 10001001 00110100101001000101011
порядок числа
-987.6543
(привожу его к порядку числа1234.5678
), что влечёт за собой сдвиг внутри мантиссы. До изменения порядка мантисса была1.11101101110100111100000
, а после изменения у нас произошёл сдвиг на1
позицию вправо. Отсекаем лишний бит и получаем0.11110110111010011110000
.Представляю дробную часть мантиссы отрицательного числа в дополнительном коде:
0.00001001000101100010000
Произвожу сложение дробных частей мантисс:
00110100101001000101011
+00001001000101100010000
=00111101101110100111011
. Если сложить целые части, то получается 1. Это один из моментов, который сбивает с толку. Целые части в данном случае не учитывается и если числа имеют разные знаки, то он всегда денормализован? Объясните этот момент, пожалуйста.
Но даже если я считаю результат денормализованым и совершаю сдвиги до тех пор, пока не получу нормализованную форму, я всё равно получаю в качестве конечного результата 11101101110100111011000
, так как освободившееся пространство заполняю нулями. Все калькуляторы указывают на то, что результатом для финальной мантиссы должно быть 11101101110100111011011
. По какому принципу добавили единицы? Это округление? Или что здесь происходит за кулисами? Что я не учёл?