Calculator app? क्या यह कोई भी बना सकता है?
(chadnauseam.com)"Calculator app? यह तो कोई भी बना सकता है" → असल में यह सही नहीं है
- Calculator को mathematical expressions का परिणाम बिल्कुल सही दिखाना चाहिए, और यह काम सोच से कहीं ज़्यादा कठिन है
- iOS के calculator में
(10^100) + 1 − (10^100)का गलत परिणाम0आता है - लेकिन Android सही तौर पर
1दिखाता है, और यह कैसे किया गया, वह सचमुच हैरान करने वाला है
Google और Hans-J. Boehm
- Google ने मशहूर programmer Hans-J. Boehm को नियुक्त किया
- Boehm, C++ में shared variables की semantics को परिभाषित करने वाले विशेषज्ञ हैं
- लेकिन उन्हें दिया गया काम उम्मीद के विपरीत calculator app बनाना था
floating-point की समस्या
- floating-point numbers
0.3या10^100जैसी values को ठीक-ठीक represent नहीं कर सकते - यानी floating-point पर आधारित calculator भरोसेमंद नहीं हो सकता
- सटीक calculation के लिए एक अलग approach की ज़रूरत होती है
Bignum से समाधान
- integer calculations की समस्या Bignum (अनंत-परिशुद्धता integer) का उपयोग करके हल की जा सकती है
- Bignum एक integer type है जो memory के आकार के अनुसार dynamically expand होता है
(10^100) + 1 - (10^100)जैसी समस्या Bignum से हल हो जाती है- लेकिन fractions की calculation अब भी हल नहीं होती
fractions और algebraic numbers
- fraction (
3/4जैसी value) को Bignum से numerator और denominator store करके संभाला जा सकता है - लेकिन π या √2 जैसे irrational numbers को इस तरह represent नहीं किया जा सकता
- Boehm ने polynomial-based representation आज़माई
- उदाहरण:
√2कोx² - 2 = 0equation से represent किया जा सकता है - लेकिन π को इस तरीके से भी represent नहीं किया जा सकता
- उदाहरण:
Constructive Real Numbers
- Boehm ने "recursive real arithmetic (RRA)" की अवधारणा की पड़ताल की
- इसमें user जितनी precision चाहता है, उतनी precision के भीतर value calculate की जाती है
- उदाहरण: π को
0.01error के भीतर व्यक्त करना हो तो3.14लौटाया जाएगा - लेकिन इस तरीके में exact comparison करना मुश्किल हो जाता है
exact 0 को दिखाने की समस्या
- RRA approach में
1 - 1को0की जगह0.0000000001की तरह भी दिखाया जा सकता है - यह user experience (UX) के लिहाज़ से समस्या पैदा करता है
- Boehm ने दूसरे researchers के साथ मिलकर इसका समाधान ढूंढ़ना शुरू किया
Richardson-Fitch algorithm
- 1994 में Dan Richardson और John Fitch ने कुछ विशेष operations के भीतर number comparison की समस्या हल की
- लेकिन यह algorithm इतना धीमा था कि व्यवहारिक रूप से उपयोग नहीं किया जा सकता था
- उदाहरण के लिए
1 ≠ 1 - e^(-e^1000)का पता लगाने में ब्रह्मांड के atoms की संख्या से भी ज़्यादा operations लग सकते हैं
RRA और rational arithmetic का संयोजन
- Boehm को RRA और rational arithmetic, दोनों के फायदे मिलाने का विचार आया
- सरल calculations (जैसे
6 × 9या8 / 3) के लिए rational arithmetic का उपयोग किया गया - irrational numbers शामिल होने पर ही RRA का उपयोग किया गया
- नतीजतन numbers को rational × real के रूप में represent किया गया
symbolic representation
- π, √2 जैसे special numbers के लिए RRA की जगह symbolic representation का उपयोग किया गया
- उदाहरण: π को "π" नाम के symbol के रूप में store किया जाता है और ज़रूरत पड़ने पर ही number में बदला जाता है
- केवल basic arithmetic ही नहीं, बल्कि trigonometric functions (sin, cos, tan), logarithms और exponential functions में भी symbolic representation का उपयोग किया गया
अंतिम समाधान
- सभी numbers को rational × real (symbolic representation या RRA) के रूप में store किया गया
- जहाँ संभव हो, precision बनाए रखने के लिए rational arithmetic का उपयोग किया गया
- symbolic representation का अधिकतम उपयोग करके RRA operations को न्यूनतम रखा गया
- नतीजतन speed और accuracy के बीच संतुलन वाला लगभग परिपूर्ण calculator system तैयार हुआ
निष्कर्ष
- Boehm और उनकी टीम द्वारा बनाया गया Android calculator कोई साधारण program नहीं है
- यह सटीक results देने के साथ तेज़ और efficient algorithms भी लागू करता है
- यह "बस एक calculator app" नहीं, बल्कि गणितीय रूप से बेहद परिष्कृत system है
"अगली बार जब आप Android calculator इस्तेमाल करें, तो इस मेहनत को याद कीजिए!"
12 टिप्पणियां
वैसे, यह दिलचस्प है कि AI neo ने इसका अनुवाद 'geojana' के भाव में किया। मूल वाक्य 'Anyone could make that' है, इसलिए उसमें ऐसा शरारती लहजा नहीं है, haha, लेकिन यहाँ तो बिल्कुल सटीक बैठता है।
जब मैं अंडरग्रेजुएट छात्र था, तब एक क्लास थी जिसमें 8086 बोर्ड को हाथ से solder करके बनाना होता था, नंबर keypad और text LCD को जोड़ना होता था, और 8086 assembly में एक calculator (जो सिर्फ चार basic operations करता था) तक बनाना होता था.
मैंने बोर्ड बनाया, keypad और LCD भी जोड़कर उसे चलाया, लेकिन calculator नहीं बना पाया.
उस समय मुझे लगा कि मुझमें software के लिए प्रतिभा नहीं है, इसलिए hardware engineer के रूप में नौकरी की, लेकिन किसी तरह अब software development कर रहा हूँ.
Calculator सच में बहुत मुश्किल था.
거자나->거잖아है। 😃फ़्लोटिंग-पॉइंट एडजस्ट करना हो तो सिरदर्द होगा, है ना? हाहाहा
कैलकुलेटर ऐप? अरे, वह तो कोई भी बना सकता है, है ना?
कैलकुलेटर की बात आते ही मुझे Windows का डिफॉल्ट कैलकुलेटर याद आता है। उसमें 2+2*2 की गणना करें तो 6 नहीं, 8 आता है। लगता है इसे जानबूझकर ऐसा बनाया गया है, लेकिन मेरी तो बिल्कुल समझ में नहीं आता। एक बार मैंने कॉकटेल में मौजूद अल्कोहल की मात्रा की गणना की थी, तो अल्कोहल पेय की कुल मात्रा से भी ज़्यादा निकल गया था, और मैं काफ़ी घबरा गया था।
यह हर बार ऑपरेटर दबाने पर पिछला expression तुरंत calculate होने वाली सामान्य इलेक्ट्रॉनिक calculator की working को follow करता है, क्या आपने सिर्फ scientific calculator ही इस्तेमाल किया है?
पूरी तरह सहमत हूँ। सोचा था कि server नहीं है तो calculator से शुरुआत करना आसान होगा, लेकिन निकलकर आने वाली calculation errors और bugs को पकड़ने में बहुत मेहनत करनी पड़ी।
सोर्स कोड में implementation overview
सोर्स कोड में calculator operation logic का विवरण
integer processing code
real number processing code
"Calculator app? अरे, वो तो कोई भी बना सकता है न" → असल में ऐसा नहीं है
इसे apply करने की संभावनाएँ तो अनगिनत लग रही हैं, हाहा
"Python? एकदम आसान है न" → असल में ऐसा नहीं है
मुझे भी देखते हुए यही विचार आया। हाहा
"JavaScript? एकदम आसान है" → असल में ऐसा नहीं है
"(10^100)+1−(10^100)"ओह, सच में iPhone Calculator में 0 दिखता है, और Android Calculator में 1।
लेकिन Google पर खोजने पर तो 0 ही दिख रहा है...
Hacker News राय
realsनाम की एक Python लाइब्रेरी पर काम कर रहा हूँ। यह लाइब्रेरीDecimalयाFractiontypes की जगह लेने के लिए डिज़ाइन की गई है। यह Bill Gosper की तकनीकों का उपयोग करके continued fractions को manipulate करती है1/(atan(1/5)-atan(1/239)-pi/4)"गणना नहीं की जा सकती" दिखाता है।1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000))आज़माने पर भी यह अब भी "गणना नहीं की जा सकती" दिखाता है