Вот как декодируется ваше первое число:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111110 00000000000000000000000
Hex: 3F00 0000
Precision: SP
Sign: Positive
Exponent: -1 (Stored: 126, Bias: 127)
Hex-float: +0x1p-1
Value: +0.5 (NORMAL)
Итак, его значение равно 0.5
, а не 1
, как вы заявили.
Вот как декодируется продукт:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111101 00000000000000000000000
Hex: 3E80 0000
Precision: SP
Sign: Positive
Exponent: -2 (Stored: 125, Bias: 127)
Hex-float: +0x1p-2
Value: +0.25 (NORMAL)
Итак, это 0.25
. И это правильно, поскольку 0.5 * 0.5 = 0.25
действительно.
Если вы хотите проверить умножение 1 * 1 = 1
, используйте следующую кодировку:
3 2 1 0
1 09876543 21098765432109876543210
S ---E8--- ----------F23----------
Binary: 0 01111111 00000000000000000000000
Hex: 3F80 0000
Precision: SP
Sign: Positive
Exponent: 0 (Stored: 127, Bias: 127)
Hex-float: +0x1p0
Value: +1.0 (NORMAL)
, то есть 0_01111111_00000000000000000000000
, как число 1.0
кодируется как 32-битное значение с плавающей точкой IEEE754 одинарной точности. В частности, обратите внимание, что показатель степени равен 8 битам, что, по-видимому, является источником проблемы в исходной кодировке, где у вас есть 7 бит.