जबकि एक signed long long int
पकड़ नहीं होगा A*B
, उनमें से दो करेंगे। तो A*B
विभिन्न घातांक के पेड़ की शर्तों को विघटित किया जा सकता है, उनमें से कोई भी एक फिटिंग 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;
उसी के लिए C*D
।
सीधे तरीके से फोलो करते हुए, प्रत्येक जोड़ी के लिए सबअरेक्शन किया जा सकता है AB_i
और CD_i
इसी तरह, प्रत्येक के लिए एक अतिरिक्त कैरी बिट (सटीक रूप से 1-बिट पूर्णांक) का उपयोग किया जा सकता है। तो अगर हम कहते हैं कि E = A * BC * D आपको कुछ मिलता है:
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
...
हम के ऊपरी-आधा स्थानांतरित करके जारी रखने E_10
के लिए E_20
(32 से पारी और जोड़ने के लिए, तो के ऊपरी हिस्से को मिटा E_10
)।
अब आप E_11
इसे सही चिह्न (नॉन-कैरी भाग से प्राप्त) के साथ जोड़कर कैरी बिट से छुटकारा पा सकते हैं E_20
। यदि यह एक अतिप्रवाह को ट्रिगर करता है, तो परिणाम या तो फिट नहीं होगा।
E_10
अब पर्याप्त 'स्थान' ऊपरी आधे हिस्से से ले जाने के लिए E_00
(शिफ्ट, ऐड, इरेज़) और कैरी बिट है E_01
।
E_10
अब फिर से बड़ा हो सकता है, इसलिए हम स्थानांतरण को दोहराते हैं E_20
।
इस बिंदु पर, E_20
शून्य होना चाहिए, अन्यथा परिणाम फिट नहीं होगा। E_10
स्थानांतरण के परिणाम के रूप में ऊपरी आधा खाली है।
अंतिम चरण के निचले आधे हस्तांतरण करने के लिए है E_20
में E_10
फिर से।
अगर उम्मीद है कि धारण E=A*B+C*D
फिट होगा signed long long int
, हम अब है
E_20=0
E_10=0
E_00=E