Meskipun signed long long int
tidak akan bertahan A*B
, dua dari mereka akan melakukannya. Jadi A*B
bisa didekomposisi menjadi pohon istilah eksponen yang berbeda, ada yang pas satu signed long long int
.
A1=A>>32;
A0=A & 0xffffffff;
B1=B>>32;
B0=B & 0xffffffff;
AB_0=A0*B0;
AB_1=A0*B1+A1*B0;
AB_2=A1*B1;
Sama untuk C*D
.
Mengikuti dengan cara yang lurus, subraksi dapat dilakukan untuk setiap pasangan AB_i
dan CD_i
juga, menggunakan carry bit tambahan (akurat integer 1-bit) untuk masing-masing. Jadi jika kita mengatakan E = A * BC * D Anda mendapatkan sesuatu seperti:
E_00=AB_0-CD_0
E_01=(AB_0 > CD_0) == (AB_0 - CD_0 < 0) ? 0 : 1 // carry bit if overflow
E_10=AB_1-CD_1
...
Kami melanjutkan dengan mentransfer bagian atas E_10
ke E_20
(bergeser sebesar 32 dan menambah, lalu menghapus bagian atas E_10
).
Sekarang Anda dapat menyingkirkan bit carry E_11
dengan menambahkannya dengan tanda yang benar (diperoleh dari bagian non-carry) ke E_20
. Jika ini memicu overflow, hasilnya tidak akan cocok.
E_10
sekarang memiliki cukup 'ruang' untuk mengambil bagian atas dari E_00
(shift, tambah, hapus) dan carry bit E_01
.
E_10
mungkin lebih besar sekarang lagi, jadi kami ulangi transfer ke E_20
.
Pada titik ini, E_20
harus menjadi nol, jika tidak hasilnya tidak akan sesuai. Bagian atas E_10
kosong karena transfer juga.
Langkah terakhir adalah mentransfer bagian bawah E_20
ke dalam E_10
lagi.
Jika harapan yang E=A*B+C*D
sesuai dengan signed long long int
palka, kita sekarang miliki
E_20=0
E_10=0
E_00=E