По факту это ж умножение с фиксированной точкой получилось. [32].[32] * [32].[32] = [64].[64], берётся целая часть результата, да и та обрезается до [32].[0]; в общем случае — на входе хрен чего выкинешь, надо диапазоны входных смотреть. И в любом случае, что частном, что общем, для такого ИМХО надо на асме писать функцию быстрого перемножения — поскольку много что в выхлоп не записывается, его можно и не считать. Это делается в столбик, как ни странно :)
BBBB.BBBB
×
CCCC.CCCC
----------------------------
.AAAA AAAA
A.AAAA AAA
AA.AAAA AA
AAA.AAAA A
+ AAAA.AAAA
a AAAA.AAA
aa AAAA.AA
aaa AAAA.A
a последний перенос
--------------------------------------------
aaaa AAAA.aaaa aaaa
Маленькие a можно не считать, всё равно обрежутся. От тех, которые суммируются в маленькие a, важны только переносы. Подмухлевав порядок сношательства с регистрами, можно сделать так, чтобы мусора хранилось поменьше.