डिवीजन एल्गोरिदम: Difference between revisions
(Created page with "{{Short description|Method for division with remainder}} {{about|algorithms for division of integers|the pencil-and-paper algorithm|Long division|the theorem proving the exist...") |
No edit summary |
||
Line 1: | Line 1: | ||
{{Short description|Method for division with remainder}} | {{Short description|Method for division with remainder}} | ||
{{about| | {{about|पूर्णांकों के विभाजन के लिए एल्गोरिदम|पेंसिल और पेपर एल्गोरिदम|लम्बा विभाजन|एक अद्वितीय भागफल और शेष के अस्तित्व को सिद्ध करने वाला प्रमेय|यूक्लिडियन विभाजन|बहुपदों के लिए विभाजन एल्गोरिथ्म|बहुपदीय विभाजन}} | ||
एक डिवीजन एल्गोरिदम एक एल्गोरिदम है, जो दो पूर्णांक एन और डी दिए गए हैं, [[यूक्लिडियन विभाजन]] के परिणाम, उनके भागफल और / या | एक डिवीजन एल्गोरिदम एक एल्गोरिदम है, जो दो पूर्णांक एन और डी दिए गए हैं, [[यूक्लिडियन विभाजन]] के परिणाम, उनके भागफल और / या शेष की गणना करते हैं। कुछ हाथ से लगाए जाते हैं, जबकि अन्य डिजिटल सर्किट डिजाइन और सॉफ्टवेयर द्वारा नियोजित होते हैं। | ||
डिवीजन एल्गोरिदम दो मुख्य श्रेणियों में आते हैं: स्लो डिवीजन और फास्ट डिवीजन। धीमा विभाजन एल्गोरिदम प्रति पुनरावृत्ति अंतिम भागफल का एक अंक उत्पन्न करता है। धीमे विभाजन के उदाहरणों में | डिवीजन एल्गोरिदम दो मुख्य श्रेणियों में आते हैं: स्लो डिवीजन और फास्ट डिवीजन। धीमा विभाजन एल्गोरिदम प्रति पुनरावृत्ति अंतिम भागफल का एक अंक उत्पन्न करता है। धीमे विभाजन के उदाहरणों में पुनर्स्थापन, गैर-निष्पादित पुनर्स्थापना, गैर-पुनर्स्थापना और एसआरटी विभाजन शामिल हैं। तीव्र विभाजन विधियाँ अंतिम भागफल के निकट सन्निकटन के साथ शुरू होती हैं और प्रत्येक पुनरावृत्ति पर अंतिम भागफल के दोगुने अंकों का उत्पादन करती हैं। न्यूटन-रफसन और गोल्डश्मिट एल्गोरिदम इस श्रेणी में आते हैं। | ||
इन एल्गोरिदम के वेरिएंट तेजी से गुणा एल्गोरिदम का उपयोग करने की अनुमति देते हैं। इसका परिणाम यह होता है कि, बड़े पूर्णांकों के लिए, एक विभाजन के लिए आवश्यक | इन एल्गोरिदम के वेरिएंट तेजी से गुणा एल्गोरिदम का उपयोग करने की अनुमति देते हैं। इसका परिणाम यह होता है कि, बड़े पूर्णांकों के लिए, एक विभाजन के लिए आवश्यक कंप्यूटर समय एक समान होता है, एक स्थिर कारक तक, गुणन के लिए आवश्यक समय के रूप में, जो भी गुणन [[कलन विधि|एल्गोरिथम]] का उपयोग किया जाता है। | ||
चर्चा फॉर्म को संदर्भित करेगी <math>N/D = (Q, R)</math>, कहाँ | चर्चा फॉर्म को संदर्भित करेगी <math>N/D = (Q, R)</math>, कहाँ | ||
Line 17: | Line 17: | ||
== बार-बार घटाव द्वारा विभाजन == | == बार-बार घटाव द्वारा विभाजन == | ||
सबसे सरल विभाजन एल्गोरिथ्म, ऐतिहासिक रूप से यूक्लिड के तत्वों, पुस्तक VII, प्रस्ताव 1 में प्रस्तुत एक महानतम सामान्य विभाजक एल्गोरिथ्म में शामिल किया गया है, केवल घटाव और तुलना का उपयोग करके शेष दो सकारात्मक पूर्णांक प्राप्त करता है: | |||
R := N | |||
Q := 0 | |||
while R ≥ D do | |||
R := R − D | |||
Q := Q + 1 | |||
end | |||
return (Q,R) | |||
सबूत है कि भागफल और शेष मौजूद हैं और अद्वितीय हैं (यूक्लिडियन डिवीजन में वर्णित) एक पूर्ण विभाजन एल्गोरिदम को जन्म देता है, जो कि नकारात्मक और सकारात्मक दोनों संख्याओं पर लागू होता है, जो कि जोड़, घटाव और तुलना का उपयोग करता है: | सबूत है कि भागफल और शेष मौजूद हैं और अद्वितीय हैं (यूक्लिडियन डिवीजन में वर्णित) एक पूर्ण विभाजन एल्गोरिदम को जन्म देता है, जो कि नकारात्मक और सकारात्मक दोनों संख्याओं पर लागू होता है, जो कि जोड़, घटाव और तुलना का उपयोग करता है: | ||
function divide(N, D) | |||
if D = 0 then error(DivisionByZero) end | |||
if D < 0 then (Q, R) := divide(N, −D); return (−Q, R) end | |||
if N < 0 then | |||
(Q,R) := divide(−N, D) | |||
if R = 0 then return (−Q, 0) | |||
else return (−Q − 1, D − R) end | |||
end | |||
-- At this point, N ≥ 0 and D > 0 | |||
return divide_unsigned(N, D) | |||
end | |||
function divide_unsigned(N, D) | |||
Q := 0; R := N | |||
while R ≥ D do | |||
Q := Q + 1 | |||
R := R − D | |||
end | |||
return (Q, R) | |||
end | |||
यह प्रक्रिया हमेशा R ≥ 0 उत्पन्न करती है। हालांकि बहुत सरल है, यह Ω(Q) कदम उठाती है, और इसलिए लंबे विभाजन जैसे धीमे विभाजन एल्गोरिदम की तुलना में घातीय रूप से धीमी है। यह उपयोगी है अगर क्यू को छोटा माना जाता है ([[आउटपुट-संवेदनशील एल्गोरिदम]] होने के नाते) और एक निष्पादन योग्य विनिर्देश के रूप में काम कर सकता है। | |||
यह प्रक्रिया हमेशा R ≥ 0 उत्पन्न करती है। हालांकि बहुत सरल है, यह Ω(Q) कदम उठाती है, और इसलिए लंबे विभाजन जैसे धीमे विभाजन एल्गोरिदम की तुलना में घातीय रूप से धीमी है। यह उपयोगी है अगर क्यू को छोटा माना जाता है ([[आउटपुट-संवेदनशील एल्गोरिदम]] होने के नाते) | |||
== लंबा विभाजन == | == लंबा विभाजन == | ||
Line 59: | Line 53: | ||
लांग डिवीज़न दशमलव अंकन में व्यक्त बहु-अंकीय संख्याओं के पेन-एंड-पेपर डिवीजन के लिए उपयोग किया जाने वाला मानक एल्गोरिथम है। यह प्रत्येक चरण में भाजक के सबसे बड़े संभावित गुणक (अंक स्तर पर) को घटाते हुए, लाभांश के बाएं से दाएं अंत में धीरे-धीरे स्थानांतरित होता है; गुणक तब भागफल के अंक बन जाते हैं, और अंतिम अंतर तब शेषफल होता है। | लांग डिवीज़न दशमलव अंकन में व्यक्त बहु-अंकीय संख्याओं के पेन-एंड-पेपर डिवीजन के लिए उपयोग किया जाने वाला मानक एल्गोरिथम है। यह प्रत्येक चरण में भाजक के सबसे बड़े संभावित गुणक (अंक स्तर पर) को घटाते हुए, लाभांश के बाएं से दाएं अंत में धीरे-धीरे स्थानांतरित होता है; गुणक तब भागफल के अंक बन जाते हैं, और अंतिम अंतर तब शेषफल होता है। | ||
जब एक बाइनरी रेडिक्स के साथ प्रयोग किया जाता है, तो यह विधि नीचे शेष एल्गोरिथम के साथ (अहस्ताक्षरित) पूर्णांक विभाजन के लिए आधार बनाती है। [[लघु विभाजन]] एक अंकीय भाजक के लिए उपयुक्त दीर्घ विभाजन का संक्षिप्त रूप है। [[चंकिंग (विभाजन)]] | जब एक बाइनरी रेडिक्स के साथ प्रयोग किया जाता है, तो यह विधि नीचे शेष एल्गोरिथम के साथ (अहस्ताक्षरित) पूर्णांक विभाजन के लिए आधार बनाती है। [[लघु विभाजन]] एक अंकीय भाजक के लिए उपयुक्त दीर्घ विभाजन का संक्षिप्त रूप है। [[चंकिंग (विभाजन)]] - जिसे आंशिक उद्धरण विधि या जल्लाद विधि के रूप में भी जाना जाता है - लंबे विभाजन का कम कुशल रूप है जिसे समझना आसान हो सकता है। किसी को वर्तमान में प्रत्येक चरण में जितने गुणक हैं, उससे अधिक गुणकों को घटाने की अनुमति देकर, लंबे विभाजन का एक अधिक मुक्त रूप संस्करण भी विकसित किया जा सकता है। | ||
=== पूर्णांक विभाजन (अहस्ताक्षरित) शेष के साथ === | === पूर्णांक विभाजन (अहस्ताक्षरित) शेष के साथ === | ||
{{Main|| | {{Main||दीर्घ विभाजन#द्विआधारी विभाजन}} | ||
{{See also| | {{See also|बाइनरी संख्या#विभाजन}} | ||
निम्नलिखित एल्गोरिदम, प्रसिद्ध लंबे विभाजन का बाइनरी संस्करण, एन को डी से विभाजित करेगा, भागफल को क्यू में और शेष को आर में रखकर। निम्नलिखित छद्म कोड में, सभी मानों को अहस्ताक्षरित पूर्णांक के रूप में माना जाता है। | निम्नलिखित एल्गोरिदम, प्रसिद्ध लंबे विभाजन का बाइनरी संस्करण, एन को डी से विभाजित करेगा, भागफल को क्यू में और शेष को आर में रखकर। निम्नलिखित छद्म कोड में, सभी मानों को अहस्ताक्षरित पूर्णांक के रूप में माना जाता है। | ||
if D = 0 then error(DivisionByZeroException) end | |||
Q := 0 -- भागफल और शेष को शून्य पर प्रारंभ करें | |||
R := 0 | |||
Q := 0 -- | for i := n − 1 .. 0 do -- जहाँ n, N में बिट्स की संख्या है | ||
R := R << 1 -- Left-shift R by 1 bit | |||
for i := n − 1 .. 0 do -- | R(0) := N(i) -- अंश के बिट i के बराबर R का न्यूनतम-महत्वपूर्ण बिट सेट करें | ||
if R ≥ D then | |||
R := R − D | |||
Q(i) := 1 | |||
end | |||
end | |||
==== उदाहरण ==== | ==== उदाहरण ==== | ||
Line 111: | Line 103: | ||
क्यू = 11<sub>2</sub> (3<sub>10</sub>) और आर = 0। | क्यू = 11<sub>2</sub> (3<sub>10</sub>) और आर = 0। | ||
== | == धीमी विभाजन विधियाँ == | ||
धीमी विभाजन विधियाँ सभी एक मानक पुनरावृत्ति समीकरण पर आधारित हैं <ref>{{Cite book|last1=Morris|first1=James E.| url=https://books.google.com/books?id=wAhEDwAAQBAJ&q=restoring+division+fixed-point+fractional+numbers&pg=PA243| title=Nanoelectronic Device Applications Handbook|last2=Iniewski|first2=Krzysztof|date=2017-11-22|publisher=CRC Press| isbn=978-1-351-83197-0|language=en}}</ref> | धीमी विभाजन विधियाँ सभी एक मानक पुनरावृत्ति समीकरण पर आधारित हैं <ref>{{Cite book|last1=Morris|first1=James E.| url=https://books.google.com/books?id=wAhEDwAAQBAJ&q=restoring+division+fixed-point+fractional+numbers&pg=PA243| title=Nanoelectronic Device Applications Handbook|last2=Iniewski|first2=Krzysztof|date=2017-11-22|publisher=CRC Press| isbn=978-1-351-83197-0|language=en}}</ref> | ||
:<math>R_{j+1} = B \times R_j - q_{n-(j+1)}\times D ,</math> | :<math>R_{j+1} = B \times R_j - q_{n-(j+1)}\times D ,</math> | ||
कहाँ: | कहाँ: | ||
* | * Rj विभाजन का j-वाँ आंशिक शेषफल है | ||
* बी [[मूलांक]] है (आधार, आमतौर पर कंप्यूटर और कैलकुलेटर में आंतरिक रूप से 2) | * बी [[मूलांक]] है (आधार, आमतौर पर कंप्यूटर और कैलकुलेटर में आंतरिक रूप से 2) | ||
* | * q n − (j + 1) स्थिति n−(j+1) में भागफल का अंक है, जहां अंकों की स्थिति को सबसे महत्वपूर्ण 0 से सबसे महत्वपूर्ण n−1 तक क्रमांकित किया जाता है। | ||
* n भागफल में अंकों की संख्या है | * n भागफल में अंकों की संख्या है | ||
* D भाजक है | * D भाजक है | ||
===विभाजन बहाल करना=== | ===विभाजन बहाल करना=== | ||
पुनर्स्थापन विभाजन [[निश्चित बिंदु अंकगणित]] | पुनर्स्थापन विभाजन [[निश्चित बिंदु अंकगणित]] संख्याओं पर संचालित होता है और धारणा 0 <D <N पर निर्भर करता है।{{citation needed|date=February 2012}} | ||
भागफल अंक q अंक समुच्चय {0,1} से बनते हैं। | भागफल अंक q अंक समुच्चय {0,1} से बनते हैं। | ||
बाइनरी (रेडिक्स 2) रीस्टोरिंग डिवीजन के लिए बुनियादी एल्गोरिथम है: | बाइनरी (रेडिक्स 2) रीस्टोरिंग डिवीजन के लिए बुनियादी एल्गोरिथम है: | ||
R := N | |||
D := D << n -- R और D को N और Q की शब्द चौड़ाई की दोगुनी आवश्यकता होती है | |||
for i := n − 1 .. 0 do -- उदाहरण : 31..0 के लिए 32 बिट्स | |||
R := 2 * R − D -- स्थानांतरित मान से परीक्षण घटाव (2 से गुणा बाइनरी प्रतिनिधित्व में एक परिवर्तन है) | |||
if R >= 0 then | |||
q(i) := 1 -- परिणामी बिट 1 | |||
else | |||
q(i) := 0 -- परिणामी बिट 0 | |||
R := R + D -- आंशिक शेष (पुनर्स्थापित) स्थानांतरित मान है | |||
end | |||
end | |||
जहाँ : N=अंश, D=भाजक, n=#बिट्स, R=आंशिक शेष, q(i)=भागफल का बिट | |||
D | |||
नॉन-परफॉर्मिंग रिस्टोरिंग डिवीजन रीस्टोरिंग डिवीजन के समान है सिवाय इसके कि 2R का मान सहेजा जाता है, इसलिए R < 0 के मामले में D को वापस जोड़ने की आवश्यकता नहीं है। | नॉन-परफॉर्मिंग रिस्टोरिंग डिवीजन रीस्टोरिंग डिवीजन के समान है सिवाय इसके कि 2R का मान सहेजा जाता है, इसलिए R < 0 के मामले में D को वापस जोड़ने की आवश्यकता नहीं है। | ||
=== गैर-पुनर्स्थापना विभाजन === | === गैर-पुनर्स्थापना विभाजन === | ||
गैर-पुनर्स्थापना विभाजन {0, 1} के बजाय भागफल अंकों के लिए अंक सेट {−1, 1} का उपयोग करता है। एल्गोरिथ्म अधिक जटिल है, लेकिन हार्डवेयर में लागू होने पर इसका लाभ होता है कि केवल एक ही निर्णय होता है और प्रति अंश बिट में जोड़/घटाव होता है; घटाव के बाद कोई पुनर्स्थापना कदम नहीं है | गैर-पुनर्स्थापना विभाजन {0, 1} के बजाय भागफल अंकों के लिए अंक सेट {−1, 1} का उपयोग करता है। एल्गोरिथ्म अधिक जटिल है, लेकिन हार्डवेयर में लागू होने पर इसका लाभ होता है कि केवल एक ही निर्णय होता है और प्रति अंश बिट में जोड़/घटाव होता है; घटाव के बाद कोई पुनर्स्थापना कदम नहीं है<ref>{{Cite journal |last=Shaw |first=Robert F. |date=1950 |title=Arithmetic Operations in a Binary Computer |url=http://aip.scitation.org/doi/10.1063/1.1745692 |journal=Review of Scientific Instruments |language=en |volume=21 |issue=8 |pages=690 |doi=10.1063/1.1745692 |bibcode=1950RScI...21..687S |issn=0034-6748}}</ref> जो संभावित रूप से संचालन की संख्या को आधे तक कम कर देता है और इसे तेजी से निष्पादित करने देता है।<ref>{{Cite web|url=https://web.stanford.edu/class/ee486/doc/chap5.pdf|title=Stanford EE486 (Advanced Computer Arithmetic Division){{snd}} Chapter 5 Handout (Division)|last=Flynn|website=Stanford University}}</ref> गैर-नकारात्मक संख्याओं के बाइनरी (मूलांक 2) गैर-पुनर्स्थापना विभाजन के लिए मूल एल्गोरिथ्म है: | ||
R := N | |||
D := D << n -- R और D को N और Q की शब्द चौड़ाई की दोगुनी आवश्यकता होती है | |||
for i = n − 1 .. 0 do -- उदाहरण : 31..0 के लिए 32 बिट्स | |||
if R >= 0 then | |||
q(i) := +1 | |||
R := 2 * R − D | |||
else | |||
q(i) := −1 | |||
R := 2 * R + D | |||
end if | |||
end | |||
-- जहाँ: N=अंश, D=भाजक, n=#बिट्स, R=आंशिक शेष, q(i)=भागफल का बिट | |||
इस एल्गोरिथम के बाद, भागफल एक गैर-मानक रूप में होता है जिसमें -1 और +1 के अंक होते हैं। अंतिम भागफल बनाने के लिए इस फॉर्म को बाइनरी में बदलने की जरूरत है। उदाहरण: | इस एल्गोरिथम के बाद, भागफल एक गैर-मानक रूप में होता है जिसमें -1 और +1 के अंक होते हैं। अंतिम भागफल बनाने के लिए इस फॉर्म को बाइनरी में बदलने की जरूरत है। उदाहरण: | ||
{| border="0" cellpadding="0" | {| border="0" cellpadding="0" | ||
|colspan=2| | | colspan="2" |निम्न भागफल को अंकों के सेट {0,1} में बदलें: | ||
|- | |- | ||
| | |प्रारम्भ || <math>Q = 111\bar{1}1\bar{1}1\bar{1}</math> | ||
|- | |- | ||
|1. Form the positive term: ||<math>P = 11101010\,</math> | |1. Form the positive term: ||<math>P = 11101010\,</math> | ||
Line 176: | Line 164: | ||
|3. Subtract: <math>P - M</math>: ||<math>Q = 11010101\,</math> | |3. Subtract: <math>P - M</math>: ||<math>Q = 11010101\,</math> | ||
|- | |- | ||
|colspan=2|*.( Signed binary notation with [[one's complement]] without [[two's complement]]) | | colspan="2" |*.( Signed binary notation with [[one's complement]] without [[two's complement]]) | ||
|} | |} | ||
यदि −1 के अंक <math>Q</math> शून्य (0) के रूप में संग्रहीत किया जाता है जैसा कि आम है <math>P</math> है <math>Q</math> और कंप्यूटिंग <math>M</math> तुच्छ है: मूल पर एक का पूरक (थोड़ा-थोड़ा पूरक) करें <math>Q</math>. | यदि −1 के अंक <math>Q</math> शून्य (0) के रूप में संग्रहीत किया जाता है जैसा कि आम है <math>P</math> है <math>Q</math> और कंप्यूटिंग <math>M</math> तुच्छ है: मूल पर एक का पूरक (थोड़ा-थोड़ा पूरक) करें <math>Q</math>. | ||
Line 182: | Line 170: | ||
Q := Q − bit.bnot(Q) -- उपयुक्त है यदि Q में −1 अंकों को शून्य के रूप में दर्शाया जाता है जैसा कि सामान्य है। | Q := Q − bit.bnot(Q) -- उपयुक्त है यदि Q में −1 अंकों को शून्य के रूप में दर्शाया जाता है जैसा कि सामान्य है। | ||
</वाक्यविन्यास हाइलाइट> | </वाक्यविन्यास हाइलाइट> | ||
Q := Q − bit.bnot(Q) -- यदि उपयुक्त Q में -1 अंक को शून्य के रूप में दर्शाया जाता है जैसा कि सामान्य है। | |||
अंत में, इस एल्गोरिथम द्वारा परिकलित भागफल हमेशा विषम होते हैं, और R में शेष −D ≤ R < D की श्रेणी में होता है। उदाहरण के लिए, 5/2 = 3 R −1। धनात्मक शेषफल में बदलने के लिए, Q के गैर-मानक रूप से मानक रूप में परिवर्तित होने के बाद एकल पुनर्स्थापन चरण करें: | अंत में, इस एल्गोरिथम द्वारा परिकलित भागफल हमेशा विषम होते हैं, और R में शेष −D ≤ R < D की श्रेणी में होता है। उदाहरण के लिए, 5/2 = 3 R −1। धनात्मक शेषफल में बदलने के लिए, Q के गैर-मानक रूप से मानक रूप में परिवर्तित होने के बाद एकल पुनर्स्थापन चरण करें: | ||
if R < 0 then | |||
Q := Q − 1 | |||
R := R + D -- यह केवल तभी आवश्यक है जब शेष ब्याज का हो। | |||
end if | |||
'''वास्तविक शेषफल R >> n है। (रिस्टोरिंग डिवीज'''न के साथ, आर के निम्न-क्रम बिट्स उसी दर पर उपयोग किए जाते हैं जैसे भागफल क्यू के बिट्स का उत्पादन होता है, और दोनों के लिए एकल शिफ्ट रजिस्टर का उपयोग करना आम है।) | |||
वास्तविक शेषफल R >> n है। (रिस्टोरिंग | |||
==={{anchor|SRT}}एसआरटी डिवीजन === | ==={{anchor|SRT}}एसआरटी डिवीजन === | ||
Line 227: | Line 212: | ||
&= {\varepsilon_i}^2. \\ | &= {\varepsilon_i}^2. \\ | ||
\end{align}</math> | \end{align}</math> | ||
प्रत्येक पुनरावृत्ति चरण में त्रुटि का यह वर्ग{{snd}} तथाकथित न्यूटन की विधि#न्यूटन-रैफसन की विधि के व्यावहारिक विचार{{snd}} इसका प्रभाव यह है कि परिणाम में सही अंकों की संख्या लगभग प्रत्येक पुनरावृत्ति के लिए दोगुनी हो जाती है, एक संपत्ति जो अत्यंत | प्रत्येक पुनरावृत्ति चरण में त्रुटि का यह वर्ग{{snd}} तथाकथित न्यूटन की विधि#न्यूटन-रैफसन की विधि के व्यावहारिक विचार{{snd}} इसका प्रभाव यह है कि परिणाम में सही अंकों की संख्या लगभग प्रत्येक पुनरावृत्ति के लिए दोगुनी हो जाती है, एक संपत्ति जो अत्यंत मानवान हो जाती है जब शामिल संख्याओं में कई अंक होते हैं (जैसे बड़े पूर्णांक डोमेन में)। लेकिन इसका मतलब यह भी है कि विधि का प्रारंभिक अभिसरण तुलनात्मक रूप से धीमा हो सकता है, खासकर यदि प्रारंभिक अनुमान <math>X_0</math> खराब चुना गया है। | ||
प्रारंभिक अनुमान चुनने की उप-समस्या के लिए <math>X_0</math>, इसे स्केल करने के लिए भाजक D पर बिट-शिफ्ट लागू करना सुविधाजनक है ताकि 0.5 ≤ D ≤ 1; अंश N पर समान बिट-शिफ्ट लगाने से, यह सुनिश्चित होता है कि भागफल नहीं बदलता है। तब कोई रूप में एक रेखीय [[सन्निकटन]] का उपयोग कर सकता है | प्रारंभिक अनुमान चुनने की उप-समस्या के लिए <math>X_0</math>, इसे स्केल करने के लिए भाजक D पर बिट-शिफ्ट लागू करना सुविधाजनक है ताकि 0.5 ≤ D ≤ 1; अंश N पर समान बिट-शिफ्ट लगाने से, यह सुनिश्चित होता है कि भागफल नहीं बदलता है। तब कोई रूप में एक रेखीय [[सन्निकटन]] का उपयोग कर सकता है | ||
Line 240: | Line 225: | ||
:<math>S = \left \lceil \log_2 \frac{P + 1}{\log_2 17} \right \rceil \,</math> | :<math>S = \left \lceil \log_2 \frac{P + 1}{\log_2 17} \right \rceil \,</math> | ||
तक के | तक के मान की गणना करने के लिए चरण पर्याप्त हैं <math>P \,</math> द्विआधारी स्थान। यह आईईईई [[एकल परिशुद्धता]] के लिए 3 और दोहरी परिशुद्धता और [[विस्तारित परिशुद्धता]] प्रारूप दोनों के लिए 4 का मानांकन करता है। | ||
==== स्यूडोकोड ==== | ==== स्यूडोकोड ==== | ||
Line 321: | Line 306: | ||
== एक स्थिर द्वारा विभाजन == | == एक स्थिर द्वारा विभाजन == | ||
एक निरंतर डी द्वारा विभाजन इसके गुणक व्युत्क्रम द्वारा गुणा के बराबर है। | एक निरंतर डी द्वारा विभाजन इसके गुणक व्युत्क्रम द्वारा गुणा के बराबर है। | ||
चूँकि हर स्थिर है, इसलिए इसका व्युत्क्रम (1/D) है। इस प्रकार संकलन समय पर एक बार (1/D) के मान की गणना करना संभव है, और रन टाइम पर विभाजन N/D के बजाय गुणन N·(1/D) करें। [[तैरनेवाला स्थल]] अंकगणित में (1/D) का उपयोग छोटी समस्या प्रस्तुत करता है,{{efn|Despite how "little" problem the optimization causes, this reciprocal optimization is still usually hidden behind a "fast math" flag in modern [[compiler]]s as it is inexact.}} लेकिन [[पूर्णांक (कंप्यूटर विज्ञान)]] अंकगणित में पारस्परिक हमेशा शून्य का | चूँकि हर स्थिर है, इसलिए इसका व्युत्क्रम (1/D) है। इस प्रकार संकलन समय पर एक बार (1/D) के मान की गणना करना संभव है, और रन टाइम पर विभाजन N/D के बजाय गुणन N·(1/D) करें। [[तैरनेवाला स्थल]] अंकगणित में (1/D) का उपयोग छोटी समस्या प्रस्तुत करता है,{{efn|Despite how "little" problem the optimization causes, this reciprocal optimization is still usually hidden behind a "fast math" flag in modern [[compiler]]s as it is inexact.}} लेकिन [[पूर्णांक (कंप्यूटर विज्ञान)]] अंकगणित में पारस्परिक हमेशा शून्य का मानांकन करेगा (यह मानते हुए |D| > 1)। | ||
विशेष रूप से (1/D) का उपयोग करना आवश्यक नहीं है; कोई भी मान (X/Y) जो (1/D) तक कम हो जाता है, का उपयोग किया जा सकता है। उदाहरण के लिए, 3 से विभाजन के लिए, कारक 1/3, 2/6, 3/9, या 194/582 का उपयोग किया जा सकता है। नतीजतन, यदि वाई दो की शक्ति होती तो विभाजन चरण तेजी से दाएं बिट शिफ्ट में कम हो जाता। (एन·एक्स)/वाई के रूप में एन/डी की गणना करने का प्रभाव एक विभाजन को एक गुणा और एक बदलाव से बदल देता है। ध्यान दें कि कोष्ठक महत्वपूर्ण हैं, क्योंकि N·(X/Y) का | विशेष रूप से (1/D) का उपयोग करना आवश्यक नहीं है; कोई भी मान (X/Y) जो (1/D) तक कम हो जाता है, का उपयोग किया जा सकता है। उदाहरण के लिए, 3 से विभाजन के लिए, कारक 1/3, 2/6, 3/9, या 194/582 का उपयोग किया जा सकता है। नतीजतन, यदि वाई दो की शक्ति होती तो विभाजन चरण तेजी से दाएं बिट शिफ्ट में कम हो जाता। (एन·एक्स)/वाई के रूप में एन/डी की गणना करने का प्रभाव एक विभाजन को एक गुणा और एक बदलाव से बदल देता है। ध्यान दें कि कोष्ठक महत्वपूर्ण हैं, क्योंकि N·(X/Y) का मानांकन शून्य होगा। | ||
हालाँकि, जब तक D स्वयं दो की शक्ति नहीं है, तब तक कोई X और Y नहीं है जो उपरोक्त शर्तों को पूरा करता हो। सौभाग्य से, (N·X)/Y पूर्णांक अंकगणित में N/D के समान परिणाम देता है, भले ही (X/Y) 1/D के बिल्कुल बराबर न हो, लेकिन इतना करीब हो कि सन्निकटन द्वारा प्रस्तुत त्रुटि में हो बिट्स जो शिफ्ट ऑपरेशन द्वारा छोड़े गए हैं।<ref>{{cite journal |title=Division by Invariant Integers using Multiplication |first1=Torbjörn |last1=Granlund |first2=Peter L. |last2=Montgomery |journal=SIGPLAN Notices |volume=29 |issue=6 |date=June 1994 |pages=61–72 |doi=10.1145/773473.178249 |url=http://gmplib.org/~tege/divcnst-pldi94.pdf |citeseerx=10.1.1.1.2556 }}</ref><ref>{{cite journal |title=Improved Division by Invariant Integers |first1=Niels |last1=Möller |first2=Torbjörn |last2=Granlund |journal=IEEE Transactions on Computers |date=February 2011 |volume=60 |issue=2 |pages=165–175 |doi=10.1109/TC.2010.143 |s2cid=13347152 |url=http://gmplib.org/~tege/division-paper.pdf }}</ref><ref> | हालाँकि, जब तक D स्वयं दो की शक्ति नहीं है, तब तक कोई X और Y नहीं है जो उपरोक्त शर्तों को पूरा करता हो। सौभाग्य से, (N·X)/Y पूर्णांक अंकगणित में N/D के समान परिणाम देता है, भले ही (X/Y) 1/D के बिल्कुल बराबर न हो, लेकिन इतना करीब हो कि सन्निकटन द्वारा प्रस्तुत त्रुटि में हो बिट्स जो शिफ्ट ऑपरेशन द्वारा छोड़े गए हैं।<ref>{{cite journal |title=Division by Invariant Integers using Multiplication |first1=Torbjörn |last1=Granlund |first2=Peter L. |last2=Montgomery |journal=SIGPLAN Notices |volume=29 |issue=6 |date=June 1994 |pages=61–72 |doi=10.1145/773473.178249 |url=http://gmplib.org/~tege/divcnst-pldi94.pdf |citeseerx=10.1.1.1.2556 }}</ref><ref>{{cite journal |title=Improved Division by Invariant Integers |first1=Niels |last1=Möller |first2=Torbjörn |last2=Granlund |journal=IEEE Transactions on Computers |date=February 2011 |volume=60 |issue=2 |pages=165–175 |doi=10.1109/TC.2010.143 |s2cid=13347152 |url=http://gmplib.org/~tege/division-paper.pdf }}</ref><ref> | ||
Line 337: | Line 322: | ||
कहाँ <math>b=\left\lfloor\frac{Na}{2^x}\right\rfloor</math> | कहाँ <math>b=\left\lfloor\frac{Na}{2^x}\right\rfloor</math> | ||
कुछ मामलों में, एक स्थिरांक द्वारा विभाजन को और भी कम समय में गुणन को एक गुणन एल्गोरिथम #Shift और add में एक स्थिरांक द्वारा परिवर्तित करके पूरा किया जा सकता है।<ref>LaBudde, Robert A.; Golovchenko, Nikolai; Newton, James; and Parker, David; [http://techref.massmind.org/techref/method/math/divconst.htm ''Massmind: "Binary Division by a Constant"'']</ref> विशेष रुचि 10 से विभाजन है, जिसके लिए यदि आवश्यक हो तो शेष के साथ, सटीक भागफल प्राप्त किया जाता है।<ref>{{cite journal |first=R. A. |last=Vowels |title=Division by 10 |journal=Australian Computer Journal |volume=24 |issue=3 |year=1992 |pages=81–85 }}</ref> | कुछ मामलों में, एक स्थिरांक द्वारा विभाजन को और भी कम समय में गुणन को एक गुणन एल्गोरिथम #Shift और add में एक स्थिरांक द्वारा परिवर्तित करके पूरा किया जा सकता है।<ref>LaBudde, Robert A.; Golovchenko, Nikolai; Newton, James; and Parker, David; [http://techref.massmind.org/techref/method/math/divconst.htm ''Massmind: "Binary Division by a Constant"'']</ref> विशेष रुचि 10 से विभाजन है, जिसके लिए यदि आवश्यक हो तो शेष के साथ, सटीक भागफल प्राप्त किया जाता है।<ref>{{cite journal |first=R. A. |last=Vowels |title=Division by 10 |journal=Australian Computer Journal |volume=24 |issue=3 |year=1992 |pages=81–85 }}</ref> | ||
== राउंडिंग एरर == | == राउंडिंग एरर == | ||
{{expand section|date=September 2012}} | {{expand section|date=September 2012}} | ||
Line 344: | Line 327: | ||
{{further | Floating point}} | {{further | Floating point}} | ||
== यह भी देखें == | == यह भी देखें == | ||
* [[गैली डिवीजन]] | * [[गैली डिवीजन]] |
Revision as of 23:16, 11 February 2023
एक डिवीजन एल्गोरिदम एक एल्गोरिदम है, जो दो पूर्णांक एन और डी दिए गए हैं, यूक्लिडियन विभाजन के परिणाम, उनके भागफल और / या शेष की गणना करते हैं। कुछ हाथ से लगाए जाते हैं, जबकि अन्य डिजिटल सर्किट डिजाइन और सॉफ्टवेयर द्वारा नियोजित होते हैं।
डिवीजन एल्गोरिदम दो मुख्य श्रेणियों में आते हैं: स्लो डिवीजन और फास्ट डिवीजन। धीमा विभाजन एल्गोरिदम प्रति पुनरावृत्ति अंतिम भागफल का एक अंक उत्पन्न करता है। धीमे विभाजन के उदाहरणों में पुनर्स्थापन, गैर-निष्पादित पुनर्स्थापना, गैर-पुनर्स्थापना और एसआरटी विभाजन शामिल हैं। तीव्र विभाजन विधियाँ अंतिम भागफल के निकट सन्निकटन के साथ शुरू होती हैं और प्रत्येक पुनरावृत्ति पर अंतिम भागफल के दोगुने अंकों का उत्पादन करती हैं। न्यूटन-रफसन और गोल्डश्मिट एल्गोरिदम इस श्रेणी में आते हैं।
इन एल्गोरिदम के वेरिएंट तेजी से गुणा एल्गोरिदम का उपयोग करने की अनुमति देते हैं। इसका परिणाम यह होता है कि, बड़े पूर्णांकों के लिए, एक विभाजन के लिए आवश्यक कंप्यूटर समय एक समान होता है, एक स्थिर कारक तक, गुणन के लिए आवश्यक समय के रूप में, जो भी गुणन एल्गोरिथम का उपयोग किया जाता है।
चर्चा फॉर्म को संदर्भित करेगी , कहाँ
- एन = अंश (लाभांश)
- डी = भाजक (भाजक)
इनपुट है, और
- क्यू = भागफल
- आर = शेष
आउटपुट है।
बार-बार घटाव द्वारा विभाजन
सबसे सरल विभाजन एल्गोरिथ्म, ऐतिहासिक रूप से यूक्लिड के तत्वों, पुस्तक VII, प्रस्ताव 1 में प्रस्तुत एक महानतम सामान्य विभाजक एल्गोरिथ्म में शामिल किया गया है, केवल घटाव और तुलना का उपयोग करके शेष दो सकारात्मक पूर्णांक प्राप्त करता है:
R := N
Q := 0 while R ≥ D do R := R − D Q := Q + 1 end return (Q,R)
सबूत है कि भागफल और शेष मौजूद हैं और अद्वितीय हैं (यूक्लिडियन डिवीजन में वर्णित) एक पूर्ण विभाजन एल्गोरिदम को जन्म देता है, जो कि नकारात्मक और सकारात्मक दोनों संख्याओं पर लागू होता है, जो कि जोड़, घटाव और तुलना का उपयोग करता है:
function divide(N, D)
if D = 0 then error(DivisionByZero) end if D < 0 then (Q, R) := divide(N, −D); return (−Q, R) end if N < 0 then (Q,R) := divide(−N, D) if R = 0 then return (−Q, 0) else return (−Q − 1, D − R) end end -- At this point, N ≥ 0 and D > 0 return divide_unsigned(N, D) end function divide_unsigned(N, D) Q := 0; R := N while R ≥ D do Q := Q + 1 R := R − D end return (Q, R) end
यह प्रक्रिया हमेशा R ≥ 0 उत्पन्न करती है। हालांकि बहुत सरल है, यह Ω(Q) कदम उठाती है, और इसलिए लंबे विभाजन जैसे धीमे विभाजन एल्गोरिदम की तुलना में घातीय रूप से धीमी है। यह उपयोगी है अगर क्यू को छोटा माना जाता है (आउटपुट-संवेदनशील एल्गोरिदम होने के नाते) और एक निष्पादन योग्य विनिर्देश के रूप में काम कर सकता है।
लंबा विभाजन
लांग डिवीज़न दशमलव अंकन में व्यक्त बहु-अंकीय संख्याओं के पेन-एंड-पेपर डिवीजन के लिए उपयोग किया जाने वाला मानक एल्गोरिथम है। यह प्रत्येक चरण में भाजक के सबसे बड़े संभावित गुणक (अंक स्तर पर) को घटाते हुए, लाभांश के बाएं से दाएं अंत में धीरे-धीरे स्थानांतरित होता है; गुणक तब भागफल के अंक बन जाते हैं, और अंतिम अंतर तब शेषफल होता है।
जब एक बाइनरी रेडिक्स के साथ प्रयोग किया जाता है, तो यह विधि नीचे शेष एल्गोरिथम के साथ (अहस्ताक्षरित) पूर्णांक विभाजन के लिए आधार बनाती है। लघु विभाजन एक अंकीय भाजक के लिए उपयुक्त दीर्घ विभाजन का संक्षिप्त रूप है। चंकिंग (विभाजन) - जिसे आंशिक उद्धरण विधि या जल्लाद विधि के रूप में भी जाना जाता है - लंबे विभाजन का कम कुशल रूप है जिसे समझना आसान हो सकता है। किसी को वर्तमान में प्रत्येक चरण में जितने गुणक हैं, उससे अधिक गुणकों को घटाने की अनुमति देकर, लंबे विभाजन का एक अधिक मुक्त रूप संस्करण भी विकसित किया जा सकता है।
पूर्णांक विभाजन (अहस्ताक्षरित) शेष के साथ
निम्नलिखित एल्गोरिदम, प्रसिद्ध लंबे विभाजन का बाइनरी संस्करण, एन को डी से विभाजित करेगा, भागफल को क्यू में और शेष को आर में रखकर। निम्नलिखित छद्म कोड में, सभी मानों को अहस्ताक्षरित पूर्णांक के रूप में माना जाता है।
if D = 0 then error(DivisionByZeroException) end
Q := 0 -- भागफल और शेष को शून्य पर प्रारंभ करें R := 0 for i := n − 1 .. 0 do -- जहाँ n, N में बिट्स की संख्या है R := R << 1 -- Left-shift R by 1 bit R(0) := N(i) -- अंश के बिट i के बराबर R का न्यूनतम-महत्वपूर्ण बिट सेट करें if R ≥ D then R := R − D Q(i) := 1 end end
उदाहरण
अगर हम एन = 1100 लेते हैं2 (1210) और डी = 1002 (410)
चरण 1: R=0 और Q=0
सेट करें
चरण 2: i=3 (एन में बिट्स की संख्या से एक कम)
लें
चरण 3: R=00 (1 द्वारा बाएं स्थानांतरित)
चरण 4: R=01 (सेटिंग R(0) से N(i))
चरण 5: R <D, इसलिए कथन छोड़ें
चरण 2: i=2
सेट करें
चरण 3: आर = 010
चरण 4: आर = 011
चरण 5: R <D, कथन छोड़ा गया
चरण 2: i=1
सेट करें
चरण 3: आर = 0110
चरण 4: आर = 0110
चरण 5: R>=D, स्टेटमेंट
दर्ज किया गया
चरण 5बी: आर=10 (आर−डी)
चरण 5c: Q=10 (Q(i) को 1 पर सेट करना)
चरण 2: i=0
सेट करें
चरण 3: आर = 100
चरण 4: आर = 100
चरण 5: R>=D, स्टेटमेंट
दर्ज किया गया
चरण 5बी: आर = 0 (आर-डी)
चरण 5c: Q=11 (Q(i) को 1 पर सेट करना)
'अंत'
क्यू = 112 (310) और आर = 0।
धीमी विभाजन विधियाँ
धीमी विभाजन विधियाँ सभी एक मानक पुनरावृत्ति समीकरण पर आधारित हैं [1]
कहाँ:
- Rj विभाजन का j-वाँ आंशिक शेषफल है
- बी मूलांक है (आधार, आमतौर पर कंप्यूटर और कैलकुलेटर में आंतरिक रूप से 2)
- q n − (j + 1) स्थिति n−(j+1) में भागफल का अंक है, जहां अंकों की स्थिति को सबसे महत्वपूर्ण 0 से सबसे महत्वपूर्ण n−1 तक क्रमांकित किया जाता है।
- n भागफल में अंकों की संख्या है
- D भाजक है
विभाजन बहाल करना
पुनर्स्थापन विभाजन निश्चित बिंदु अंकगणित संख्याओं पर संचालित होता है और धारणा 0 <D <N पर निर्भर करता है।[citation needed]
भागफल अंक q अंक समुच्चय {0,1} से बनते हैं।
बाइनरी (रेडिक्स 2) रीस्टोरिंग डिवीजन के लिए बुनियादी एल्गोरिथम है:
R := N D := D << n -- R और D को N और Q की शब्द चौड़ाई की दोगुनी आवश्यकता होती है for i := n − 1 .. 0 do -- उदाहरण : 31..0 के लिए 32 बिट्स R := 2 * R − D -- स्थानांतरित मान से परीक्षण घटाव (2 से गुणा बाइनरी प्रतिनिधित्व में एक परिवर्तन है) if R >= 0 then q(i) := 1 -- परिणामी बिट 1 else q(i) := 0 -- परिणामी बिट 0 R := R + D -- आंशिक शेष (पुनर्स्थापित) स्थानांतरित मान है end end
जहाँ : N=अंश, D=भाजक, n=#बिट्स, R=आंशिक शेष, q(i)=भागफल का बिट
नॉन-परफॉर्मिंग रिस्टोरिंग डिवीजन रीस्टोरिंग डिवीजन के समान है सिवाय इसके कि 2R का मान सहेजा जाता है, इसलिए R < 0 के मामले में D को वापस जोड़ने की आवश्यकता नहीं है।
गैर-पुनर्स्थापना विभाजन
गैर-पुनर्स्थापना विभाजन {0, 1} के बजाय भागफल अंकों के लिए अंक सेट {−1, 1} का उपयोग करता है। एल्गोरिथ्म अधिक जटिल है, लेकिन हार्डवेयर में लागू होने पर इसका लाभ होता है कि केवल एक ही निर्णय होता है और प्रति अंश बिट में जोड़/घटाव होता है; घटाव के बाद कोई पुनर्स्थापना कदम नहीं है[2] जो संभावित रूप से संचालन की संख्या को आधे तक कम कर देता है और इसे तेजी से निष्पादित करने देता है।[3] गैर-नकारात्मक संख्याओं के बाइनरी (मूलांक 2) गैर-पुनर्स्थापना विभाजन के लिए मूल एल्गोरिथ्म है:
R := N
D := D << n -- R और D को N और Q की शब्द चौड़ाई की दोगुनी आवश्यकता होती है for i = n − 1 .. 0 do -- उदाहरण : 31..0 के लिए 32 बिट्स if R >= 0 then q(i) := +1 R := 2 * R − D else q(i) := −1 R := 2 * R + D end if end -- जहाँ: N=अंश, D=भाजक, n=#बिट्स, R=आंशिक शेष, q(i)=भागफल का बिट
इस एल्गोरिथम के बाद, भागफल एक गैर-मानक रूप में होता है जिसमें -1 और +1 के अंक होते हैं। अंतिम भागफल बनाने के लिए इस फॉर्म को बाइनरी में बदलने की जरूरत है। उदाहरण:
निम्न भागफल को अंकों के सेट {0,1} में बदलें: | |
प्रारम्भ | |
1. Form the positive term: | |
2. Mask the negative term*: | |
3. Subtract: : | |
*.( Signed binary notation with one's complement without two's complement) |
यदि −1 के अंक शून्य (0) के रूप में संग्रहीत किया जाता है जैसा कि आम है है और कंप्यूटिंग तुच्छ है: मूल पर एक का पूरक (थोड़ा-थोड़ा पूरक) करें . <वाक्यविन्यास लैंग = लुआ> Q := Q − bit.bnot(Q) -- उपयुक्त है यदि Q में −1 अंकों को शून्य के रूप में दर्शाया जाता है जैसा कि सामान्य है। </वाक्यविन्यास हाइलाइट>
Q := Q − bit.bnot(Q) -- यदि उपयुक्त Q में -1 अंक को शून्य के रूप में दर्शाया जाता है जैसा कि सामान्य है।
अंत में, इस एल्गोरिथम द्वारा परिकलित भागफल हमेशा विषम होते हैं, और R में शेष −D ≤ R < D की श्रेणी में होता है। उदाहरण के लिए, 5/2 = 3 R −1। धनात्मक शेषफल में बदलने के लिए, Q के गैर-मानक रूप से मानक रूप में परिवर्तित होने के बाद एकल पुनर्स्थापन चरण करें:
if R < 0 then Q := Q − 1 R := R + D -- यह केवल तभी आवश्यक है जब शेष ब्याज का हो। end if
वास्तविक शेषफल R >> n है। (रिस्टोरिंग डिवीजन के साथ, आर के निम्न-क्रम बिट्स उसी दर पर उपयोग किए जाते हैं जैसे भागफल क्यू के बिट्स का उत्पादन होता है, और दोनों के लिए एकल शिफ्ट रजिस्टर का उपयोग करना आम है।)
एसआरटी डिवीजन
एसआरटी डिवीजन कई माइक्रोप्रोसेसर कार्यान्वयन में विभाजन के लिए एक लोकप्रिय तरीका है।[4][5] एल्गोरिदम का नाम डी.डब्ल्यू. आईबीएम के स्वीनी, इलिनोइस विश्वविद्यालय के जेम्स ई। रॉबर्टसन और इंपीरियल कॉलेज लंदन के केडी टॉचर। उन सभी ने लगभग एक ही समय में स्वतंत्र रूप से एल्गोरिदम विकसित किया (क्रमशः फरवरी 1957, सितंबर 1958 और जनवरी 1958 में प्रकाशित)।[6][7][8] एसआरटी विभाजन गैर-पुनर्स्थापना विभाजन के समान है, लेकिन यह प्रत्येक भागफल अंक निर्धारित करने के लिए लाभांश और भाजक के आधार पर एक लुकअप तालिका का उपयोग करता है।
सबसे महत्वपूर्ण अंतर यह है कि भागफल के लिए अनावश्यक प्रतिनिधित्व का उपयोग किया जाता है। उदाहरण के लिए, रेडिक्स-4 एसआरटी डिवीजन लागू करते समय, प्रत्येक भागफल अंक को पांच संभावनाओं में से चुना जाता है: {-2, -1, 0, +1, +2}। इस वजह से, एक भागफल अंक का चुनाव सही नहीं होना चाहिए; बाद के भागफल अंक मामूली त्रुटियों के लिए सही हो सकते हैं। (उदाहरण के लिए, भागफल अंक जोड़े (0, +2) और (1, -2) समतुल्य हैं, क्योंकि 0×4+2 = 1×4−2।) यह सहिष्णुता भागफल अंकों को केवल कुछ का उपयोग करके चुनने की अनुमति देती है। पूर्ण-चौड़ाई घटाव की आवश्यकता के बजाय लाभांश और भाजक के सबसे महत्वपूर्ण बिट। बदले में यह सरलीकरण 2 से अधिक मूलांक का उपयोग करने की अनुमति देता है।
गैर-पुनर्स्थापना विभाजन की तरह, अंतिम चरण अंतिम भागफल बिट को हल करने के लिए अंतिम पूर्ण-चौड़ाई घटाव है, और भागफल का मानक बाइनरी रूप में रूपांतरण।
मूल इंटेल पेंटियम (P5 माइक्रोआर्किटेक्चर) प्रोसेसर का पेंटियम FDIV बग | कुख्यात फ़्लोटिंग-पॉइंट डिवीजन बग गलत कोडित तालिका देखो के कारण हुआ था। 1066 प्रविष्टियों में से पांच को गलती से छोड़ दिया गया था।[9][10]
फास्ट डिवीजन के तरीके
न्यूटन-रैफसन डिवीजन
न्यूटन-रैफसन का गुणक व्युत्क्रम ज्ञात करने के लिए न्यूटन की विधि का उपयोग करता है और उस व्युत्क्रम को से गुणा करें खोजने के लिए final quotient . न्यूटन-रेफसन डिवीजन के चरण हैं:
- एक अनुमान की गणना करें पारस्परिक के लिए भाजक का .
- क्रमिक रूप से अधिक सटीक अनुमानों की गणना करें पारस्परिक का। यह वह जगह है जहां कोई न्यूटन-रैफसन पद्धति को इस तरह से नियोजित करता है।
- भाजक के व्युत्क्रम द्वारा लाभांश को गुणा करके भागफल की गणना करें: .
के व्युत्क्रम को खोजने के लिए न्यूटन की विधि को लागू करने के लिए , एक फ़ंक्शन खोजना आवश्यक है जिसमें शून्य है . स्पष्ट ऐसा कार्य है , लेकिन इसके लिए न्यूटन-रैफसन पुनरावृत्ति अनुपयोगी है, क्योंकि इसके व्युत्क्रम को जाने बिना इसकी गणना नहीं की जा सकती (इसके अलावा यह पुनरावृत्त सुधारों की अनुमति देने के बजाय एक चरण में सटीक पारस्परिक गणना करने का प्रयास करता है)। कार्य करने वाला कार्य है , जिसके लिए न्यूटन-रफसन पुनरावृति देता है
जिससे गणना की जा सकती है केवल गुणा और घटाव का उपयोग करना, या दो जुड़े हुए गुणा-जोड़ का उपयोग करना।
गणना के दृष्टिकोण से, भाव और समकक्ष नहीं हैं। दूसरी अभिव्यक्ति का उपयोग करते समय 2n बिट्स की सटीकता के साथ एक परिणाम प्राप्त करने के लिए, उत्पाद के बीच की गणना करनी चाहिए और की दी गई सटीकता से दोगुनी है (एन बिट्स)।[citation needed] इसके विपरीत, उत्पाद के बीच और केवल n बिट्स की सटीकता के साथ गणना करने की आवश्यकता है, क्योंकि अग्रणी n बिट्स (बाइनरी पॉइंट के बाद)। शून्य हैं।
यदि त्रुटि के रूप में परिभाषित किया गया है , तब:
प्रत्येक पुनरावृत्ति चरण में त्रुटि का यह वर्ग – तथाकथित न्यूटन की विधि#न्यूटन-रैफसन की विधि के व्यावहारिक विचार – इसका प्रभाव यह है कि परिणाम में सही अंकों की संख्या लगभग प्रत्येक पुनरावृत्ति के लिए दोगुनी हो जाती है, एक संपत्ति जो अत्यंत मानवान हो जाती है जब शामिल संख्याओं में कई अंक होते हैं (जैसे बड़े पूर्णांक डोमेन में)। लेकिन इसका मतलब यह भी है कि विधि का प्रारंभिक अभिसरण तुलनात्मक रूप से धीमा हो सकता है, खासकर यदि प्रारंभिक अनुमान खराब चुना गया है।
प्रारंभिक अनुमान चुनने की उप-समस्या के लिए , इसे स्केल करने के लिए भाजक D पर बिट-शिफ्ट लागू करना सुविधाजनक है ताकि 0.5 ≤ D ≤ 1; अंश N पर समान बिट-शिफ्ट लगाने से, यह सुनिश्चित होता है कि भागफल नहीं बदलता है। तब कोई रूप में एक रेखीय सन्निकटन का उपयोग कर सकता है
न्यूटन-रैफसन को इनिशियलाइज़ करने के लिए। अंतराल पर इस सन्निकटन की त्रुटि के निरपेक्ष मान के अधिकतम को कम करने के लिए , प्रयोग करना चाहिए
रैखिक सन्निकटन के गुणांक निम्नानुसार निर्धारित किए जाते हैं। त्रुटि का निरपेक्ष मान है . त्रुटि के अधिकतम निरपेक्ष मान का न्यूनतम उपयोग किए गए समदोलन प्रमेय द्वारा निर्धारित किया जाता है . स्थानीय न्यूनतम तब होता है जब , जिसका समाधान है . उस न्यूनतम पर फ़ंक्शन विपरीत चिह्न का होना चाहिए, जैसा कि अंत बिंदु पर फ़ंक्शन, अर्थात्, . दो अज्ञात में दो समीकरणों का एक अनूठा समाधान है और , और अधिकतम त्रुटि है . इस सन्निकटन का उपयोग करते हुए, प्रारंभिक मान की त्रुटि का निरपेक्ष मान से कम है
रेमेज़ एल्गोरिथ्म का उपयोग करके गुणांक की गणना करते हुए, 1 से बड़ी डिग्री का बहुपद फिट उत्पन्न करना संभव है। व्यापार-बंद यह है कि प्रारंभिक अनुमान के लिए अधिक कम्प्यूटेशनल चक्रों की आवश्यकता होती है लेकिन उम्मीद है कि न्यूटन-रैफसन के कम पुनरावृत्तियों के बदले में।
चूंकि इस विधि के लिए अभिसरण की दर बिल्कुल द्विघात है, यह उसी का अनुसरण करता है
तक के मान की गणना करने के लिए चरण पर्याप्त हैं द्विआधारी स्थान। यह आईईईई एकल परिशुद्धता के लिए 3 और दोहरी परिशुद्धता और विस्तारित परिशुद्धता प्रारूप दोनों के लिए 4 का मानांकन करता है।
स्यूडोकोड
निम्नलिखित के भागफल की गणना करता है N और D सटीकता के साथ P द्विआधारी स्थान:
D को M × 2 के रूप में व्यक्त करेंe जहां 1 ≤ M < 2 (मानक फ़्लोटिंग पॉइंट प्रतिनिधित्व) द' := डी/2e+1 // 0.5 और 1 के बीच का पैमाना, बिट शिफ्ट / एक्सपोनेंट घटाव के साथ किया जा सकता है न' := न/2ई+1 X := 48/17 − 32/17 × D' // डी के समान सटीकता के साथ पूर्व-गणना स्थिरांक
repeat times // फिक्स्ड पी के आधार पर प्रीकंप्यूटेड किया जा सकता है
एक्स := एक्स + एक्स × (1 - डी '× एक्स) 'अंत' 'वापसी' एन '× एक्स
उदाहरण के लिए, डबल-परिशुद्धता फ़्लोटिंग-पॉइंट डिवीजन के लिए, यह विधि 10 गुणा, 9 जोड़ और 2 शिफ्ट का उपयोग करती है।
वैरिएंट न्यूटन-रैफसन डिवीजन
न्यूटन-रफसन विभाजन विधि को निम्नानुसार थोड़ा तेज करने के लिए संशोधित किया जा सकता है। एन और डी को स्थानांतरित करने के बाद ताकि डी [0.5, 1.0] में हो, के साथ आरंभ करें
यह 1/डी के लिए सबसे अच्छा द्विघात फिट है और 1/99 से कम या उसके बराबर त्रुटि का पूर्ण मान देता है। इसे पहली तरह के चेबिशेव बहुपद के तीसरे क्रम के पुन: स्केल किए गए त्रुटि के बराबर बनाने के लिए चुना गया है। गुणांक पूर्व-गणना और हार्ड-कोडेड होना चाहिए।
फिर लूप में, एक पुनरावृत्ति का उपयोग करें जो त्रुटि को घनित करता है।
Y·E पद नया है।
यदि लूप को तब तक निष्पादित किया जाता है जब तक कि एक्स इसके अग्रणी पी बिट्स पर 1/डी से सहमत नहीं हो जाता है, तो पुनरावृत्तियों की संख्या इससे अधिक नहीं होगी
जो 2 प्राप्त करने के लिए 99 को घन करने की संख्या हैपी+1. तब
P बिट्स का भागफल है।
इनिशियलाइज़ेशन या पुनरावृत्ति में उच्च डिग्री बहुपदों का उपयोग करने से प्रदर्शन में गिरावट आती है क्योंकि अतिरिक्त गुणन की आवश्यकता अधिक पुनरावृत्तियों को करने पर बेहतर खर्च होगी।
गोल्डस्मिथ डिवीजन
गोल्डस्मिथ डिवीजन[11] (रॉबर्ट इलियट गोल्डश्मिड्ट के बाद[12]) लाभांश और भाजक दोनों को एक सामान्य कारक F द्वारा बार-बार गुणा करने की पुनरावृत्त प्रक्रिया का उपयोग करता हैi, इस तरह चुना जाता है कि भाजक 1 में परिवर्तित हो जाता है। यह लाभांश को मांगे गए भागफल क्यू में परिवर्तित करने का कारण बनता है:
गोल्डश्मिड्ट डिवीजन के चरण हैं:
- गुणन कारक F के लिए एक अनुमान उत्पन्न करेंi.
- लाभांश और भाजक को F से गुणा करेंi.
- यदि विभाजक पर्याप्त रूप से 1 के करीब है, तो लाभांश वापस करें, अन्यथा चरण 1 पर लूप करें।
मान लें कि N/D को इस तरह बढ़ाया गया है कि 0 < D < 1, प्रत्येक Fiडी पर आधारित है:
भाज्य और भाजक को गुणनखंड से गुणा करने पर प्राप्त होता है:
पुनरावृत्तियों की पर्याप्त संख्या k के बाद .
Goldschmidt पद्धति का उपयोग AMD Athlon CPU और बाद के मॉडल में किया जाता है।[13][14] इसे एंडरसन अर्ल गोल्डश्मिड्ट पॉवर्स (एईजीपी) एल्गोरिथम के रूप में भी जाना जाता है और इसे विभिन्न आईबीएम प्रोसेसर द्वारा कार्यान्वित किया जाता है।[15][16] यद्यपि यह न्यूटन-रैफसन कार्यान्वयन के समान दर पर अभिसरण करता है, गोल्डस्मिथ पद्धति का एक लाभ यह है कि अंश और भाजक में गुणा समानांतर में किया जा सकता है।[16]
द्विपद प्रमेय
गोल्डश्मिट विधि का उपयोग उन कारकों के साथ किया जा सकता है जो द्विपद प्रमेय द्वारा सरलीकरण की अनुमति देते हैं। मान लें कि एन/डी को दो की शक्ति से बढ़ाया गया है . हम चुनते हैं और . यह प्रदान करता है
- .
बाद कदम , भाजक तक गोल किया जा सकता है सापेक्ष त्रुटि के साथ
जो कि अधिकतम है कब , इस प्रकार न्यूनतम सटीकता प्रदान करता है बाइनरी अंक।
बड़े-पूर्णांक तरीके
हार्डवेयर कार्यान्वयन के लिए डिज़ाइन किए गए तरीके आमतौर पर हजारों या लाखों दशमलव अंकों के साथ पूर्णांकों को मापते नहीं हैं; ये अक्सर होते हैं, उदाहरण के लिए, क्रिप्टोग्राफी में मॉड्यूलर अंकगणितीय कटौती में। इन बड़े पूर्णांकों के लिए, अधिक कुशल विभाजन एल्गोरिदम समस्या को कम संख्या में गुणन का उपयोग करने के लिए रूपांतरित करते हैं, जो तब करत्सुबा एल्गोरिथम, टूम-कुक गुणन या शॉनहेज-स्ट्रैसन एल्गोरिथम जैसे असम्बद्ध रूप से कुशल गुणन एल्गोरिथ्म का उपयोग करके किया जा सकता है। परिणाम यह है कि विभाजन की कम्प्यूटेशनल जटिलता गुणा के समान क्रम (गुणक स्थिरांक तक) की है। उदाहरणों में न्यूटन-रैफसन विभाजन के रूप में न्यूटन की विधि द्वारा गुणन में कमी शामिल है,[17] साथ ही थोड़ा तेज़ बर्निकेल-ज़ीग्लर डिवीजन,[18] बैरेट कमी और मोंटगोमरी कमी एल्गोरिदम।[19][verification needed] न्यूटन की विधि उन परिदृश्यों में विशेष रूप से कुशल है जहां एक ही विभाजक द्वारा कई बार विभाजित किया जाना चाहिए, क्योंकि प्रारंभिक न्यूटन व्युत्क्रम के बाद प्रत्येक विभाजन के लिए केवल एक (संक्षिप्त) गुणन की आवश्यकता होती है।
एक स्थिर द्वारा विभाजन
एक निरंतर डी द्वारा विभाजन इसके गुणक व्युत्क्रम द्वारा गुणा के बराबर है। चूँकि हर स्थिर है, इसलिए इसका व्युत्क्रम (1/D) है। इस प्रकार संकलन समय पर एक बार (1/D) के मान की गणना करना संभव है, और रन टाइम पर विभाजन N/D के बजाय गुणन N·(1/D) करें। तैरनेवाला स्थल अंकगणित में (1/D) का उपयोग छोटी समस्या प्रस्तुत करता है,[lower-alpha 1] लेकिन पूर्णांक (कंप्यूटर विज्ञान) अंकगणित में पारस्परिक हमेशा शून्य का मानांकन करेगा (यह मानते हुए |D| > 1)।
विशेष रूप से (1/D) का उपयोग करना आवश्यक नहीं है; कोई भी मान (X/Y) जो (1/D) तक कम हो जाता है, का उपयोग किया जा सकता है। उदाहरण के लिए, 3 से विभाजन के लिए, कारक 1/3, 2/6, 3/9, या 194/582 का उपयोग किया जा सकता है। नतीजतन, यदि वाई दो की शक्ति होती तो विभाजन चरण तेजी से दाएं बिट शिफ्ट में कम हो जाता। (एन·एक्स)/वाई के रूप में एन/डी की गणना करने का प्रभाव एक विभाजन को एक गुणा और एक बदलाव से बदल देता है। ध्यान दें कि कोष्ठक महत्वपूर्ण हैं, क्योंकि N·(X/Y) का मानांकन शून्य होगा।
हालाँकि, जब तक D स्वयं दो की शक्ति नहीं है, तब तक कोई X और Y नहीं है जो उपरोक्त शर्तों को पूरा करता हो। सौभाग्य से, (N·X)/Y पूर्णांक अंकगणित में N/D के समान परिणाम देता है, भले ही (X/Y) 1/D के बिल्कुल बराबर न हो, लेकिन इतना करीब हो कि सन्निकटन द्वारा प्रस्तुत त्रुटि में हो बिट्स जो शिफ्ट ऑपरेशन द्वारा छोड़े गए हैं।[20][21][22] बैरेट रिडक्शन वाई के मान के लिए 2 की शक्तियों का उपयोग करता है ताकि वाई द्वारा विभाजन को एक सरल दायां शिफ्ट बनाया जा सके।[lower-alpha 2] एक ठोस निश्चित-बिंदु अंकगणितीय उदाहरण के रूप में, 32-बिट अहस्ताक्षरित पूर्णांकों के लिए, 3 से विभाजन को गुणा द्वारा प्रतिस्थापित किया जा सकता है 2863311531/233, 2863311531 (हेक्साडेसिमल 0xAAAAAAAB) द्वारा एक गुणा और उसके बाद 33 दाएँ बिट शिफ़्ट। 2863311531 के मान की गणना इस प्रकार की जाती है 233/3, फिर गोल किया। इसी तरह, 10 से विभाजन को 3435973837 (0xCCCCCCCD) के गुणन के बाद 2 से विभाजन के रूप में व्यक्त किया जा सकता है35 (या 35 राइट बिट शिफ्ट)।[24]: p230-234 OEIS गुणन के लिए स्थिरांकों के अनुक्रम प्रदान करता है A346495 और सही बदलाव के लिए A346496.
सामान्य के लिए -बिट अहस्ताक्षरित पूर्णांक विभाजन जहां विभाजक 2 की शक्ति नहीं है, निम्नलिखित पहचान विभाजन को दो में परिवर्तित करती है -बिट जोड़/घटाव, एक -बिट द्वारा -बिट गुणन (जहां परिणाम के केवल ऊपरी आधे हिस्से का उपयोग किया जाता है) और कई बदलाव, प्रीकंप्यूटिंग के बाद और :
कहाँ कुछ मामलों में, एक स्थिरांक द्वारा विभाजन को और भी कम समय में गुणन को एक गुणन एल्गोरिथम #Shift और add में एक स्थिरांक द्वारा परिवर्तित करके पूरा किया जा सकता है।[25] विशेष रुचि 10 से विभाजन है, जिसके लिए यदि आवश्यक हो तो शेष के साथ, सटीक भागफल प्राप्त किया जाता है।[26]
राउंडिंग एरर
This section needs expansion. You can help by adding to it. (September 2012) |
सीमित परिशुद्धता (कंप्यूटर विज्ञान) के कारण डिवीजन संचालन द्वारा राउंड-ऑफ त्रुटि पेश की जा सकती है।
यह भी देखें
- गैली डिवीजन
- गुणन एल्गोरिथ्म
- पेंटियम FDIV बग
टिप्पणियाँ
- ↑ Despite how "little" problem the optimization causes, this reciprocal optimization is still usually hidden behind a "fast math" flag in modern compilers as it is inexact.
- ↑ Modern compilers commonly perform this integer multiply-and-shift optimization; for a constant only known at run-time, however, the program must implement the optimization itself.[23]
संदर्भ
- ↑ Morris, James E.; Iniewski, Krzysztof (2017-11-22). Nanoelectronic Device Applications Handbook (in English). CRC Press. ISBN 978-1-351-83197-0.
- ↑ Shaw, Robert F. (1950). "Arithmetic Operations in a Binary Computer". Review of Scientific Instruments (in English). 21 (8): 690. Bibcode:1950RScI...21..687S. doi:10.1063/1.1745692. ISSN 0034-6748.
- ↑ Flynn. "Stanford EE486 (Advanced Computer Arithmetic Division) – Chapter 5 Handout (Division)" (PDF). Stanford University.
- ↑ Harris, David L.; Oberman, Stuart F.; Horowitz, Mark A. (9 September 1998). SRT Division: Architectures, Models, and Implementations (PDF) (Technical report). Stanford University.
- ↑ McCann, Mark; Pippenger, Nicholas (2005). "SRT Division Algorithms as Dynamical Systems". SIAM Journal on Computing. 34 (6): 1279–1301. CiteSeerX 10.1.1.72.6993. doi:10.1137/S009753970444106X.
- ↑ Cocke, John; Sweeney, D.W. (11 February 1957), High speed arithmetic in a parallel device (Company Memo), IBM, p. 20
{{citation}}
: CS1 maint: location missing publisher (link) - ↑ Robertson, James (1958-09-01). "A New Class of Digital Division Methods". IRE Transactions on Electronic Computers. IEEE. EC-7: 218–222. doi:10.1109/TEC.1958.5222579. hdl:2027/uiuo.ark:/13960/t0gt7529c.
- ↑ Tocher, K.D. (1958-01-01). "TECHNIQUES OF MULTIPLICATION AND DIVISION FOR AUTOMATIC BINARY COMPUTERS". The Quarterly Journal of Mechanics and Applied Mathematics. 11 (3): 20.
- ↑ "Statistical Analysis of Floating Point Flaw". Intel Corporation. 1994. Retrieved 22 October 2013.
- ↑ Oberman, Stuart F.; Flynn, Michael J. (July 1995). An Analysis of Division Algorithms and Implementations (PDF) (Technical report). Stanford University. CSL-TR-95-675.
- ↑ Goldschmidt, Robert E. (1964). Applications of Division by Convergence (PDF) (Thesis). M.Sc. dissertation. M.I.T. OCLC 34136725.
- ↑ https://web.archive.org/web/20180718114413/https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=5392026
- ↑ Oberman, Stuart F. (1999). "Floating Point Division and Square Root Algorithms and Implementation in the AMD-K7 Microprocessor" (PDF). Proceedings of the IEEE Symposium on Computer Arithmetic: 106–115. doi:10.1109/ARITH.1999.762835. S2CID 12793819.
- ↑ Soderquist, Peter; Leeser, Miriam (July–August 1997). "Division and Square Root: Choosing the Right Implementation". IEEE Micro. 17 (4): 56–66. doi:10.1109/40.612224.
- ↑ S. F. Anderson, J. G. Earle, R. E. Goldschmidt, D. M. Powers. The IBM 360/370 model 91: floating-point execution unit, IBM Journal of Research and Development, January 1997
- ↑ 16.0 16.1 Guy, Even; Peter, Siedel; Ferguson, Warren (1 February 2005). "A parametric error analysis of Goldschmidt's division algorithm". Journal of Computer and System Sciences. 70 (1): 118–139. doi:10.1016/j.jcss.2004.08.004.
- ↑ Hasselström, Karl (2003). Fast Division of Large Integers: A Comparison of Algorithms (PDF) (M.Sc. in Computer Science thesis). Royal Institute of Technology. Archived from the original (PDF) on 8 July 2017. Retrieved 2017-07-08.
- ↑ Joachim Ziegler, Christoph Burnikel (1998), Fast Recursive Division, Max-Planck-Institut für Informatik
{{citation}}
: CS1 maint: location missing publisher (link) - ↑ Barrett, Paul (1987). "Implementing the Rivest Shamir and Adleman public key encryption algorithm on a standard digital signal processor". Proceedings on Advances in cryptology---CRYPTO '86. London, UK: Springer-Verlag. pp. 311–323. ISBN 0-387-18047-8.
- ↑ Granlund, Torbjörn; Montgomery, Peter L. (June 1994). "Division by Invariant Integers using Multiplication" (PDF). SIGPLAN Notices. 29 (6): 61–72. CiteSeerX 10.1.1.1.2556. doi:10.1145/773473.178249.
- ↑ Möller, Niels; Granlund, Torbjörn (February 2011). "Improved Division by Invariant Integers" (PDF). IEEE Transactions on Computers. 60 (2): 165–175. doi:10.1109/TC.2010.143. S2CID 13347152.
- ↑ ridiculous_fish. "Labor of Division (Episode III): Faster Unsigned Division by Constants". 2011.
- ↑ ridiculous_fish. "libdivide, optimized integer division". Retrieved 6 July 2021.
- ↑ Warren Jr., Henry S. (2013). Hacker's Delight (2 ed.). Addison Wesley - Pearson Education, Inc. ISBN 978-0-321-84268-8.
- ↑ LaBudde, Robert A.; Golovchenko, Nikolai; Newton, James; and Parker, David; Massmind: "Binary Division by a Constant"
- ↑ Vowels, R. A. (1992). "Division by 10". Australian Computer Journal. 24 (3): 81–85.
अग्रिम पठन
- Savard, John J. G. (2018) [2006]. "Advanced Arithmetic Techniques". quadibloc. Archived from the original on 2018-07-03. Retrieved 2018-07-16.