59 पॉइंट द्वारा GN⁺ 2025-02-17 | 12 टिप्पणियां | WhatsApp पर शेयर करें

"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 = 0 equation से represent किया जा सकता है
    • लेकिन π को इस तरीके से भी represent नहीं किया जा सकता

Constructive Real Numbers

  • Boehm ने "recursive real arithmetic (RRA)" की अवधारणा की पड़ताल की
  • इसमें user जितनी precision चाहता है, उतनी precision के भीतर value calculate की जाती है
  • उदाहरण: π को 0.01 error के भीतर व्यक्त करना हो तो 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 टिप्पणियां

 
street62 2025-02-20

वैसे, यह दिलचस्प है कि AI neo ने इसका अनुवाद 'geojana' के भाव में किया। मूल वाक्य 'Anyone could make that' है, इसलिए उसमें ऐसा शरारती लहजा नहीं है, haha, लेकिन यहाँ तो बिल्कुल सटीक बैठता है।

 
gurugio 2025-02-19

जब मैं अंडरग्रेजुएट छात्र था, तब एक क्लास थी जिसमें 8086 बोर्ड को हाथ से solder करके बनाना होता था, नंबर keypad और text LCD को जोड़ना होता था, और 8086 assembly में एक calculator (जो सिर्फ चार basic operations करता था) तक बनाना होता था.
मैंने बोर्ड बनाया, keypad और LCD भी जोड़कर उसे चलाया, लेकिन calculator नहीं बना पाया.
उस समय मुझे लगा कि मुझमें software के लिए प्रतिभा नहीं है, इसलिए hardware engineer के रूप में नौकरी की, लेकिन किसी तरह अब software development कर रहा हूँ.
Calculator सच में बहुत मुश्किल था.

 
yunsub2 2025-02-19

거자나 -> 거잖아 है। 😃

 
carnoxen 2025-02-18

फ़्लोटिंग-पॉइंट एडजस्ट करना हो तो सिरदर्द होगा, है ना? हाहाहा

 
tribela 2025-02-18

कैलकुलेटर ऐप? अरे, वह तो कोई भी बना सकता है, है ना?

कैलकुलेटर की बात आते ही मुझे Windows का डिफॉल्ट कैलकुलेटर याद आता है। उसमें 2+2*2 की गणना करें तो 6 नहीं, 8 आता है। लगता है इसे जानबूझकर ऐसा बनाया गया है, लेकिन मेरी तो बिल्कुल समझ में नहीं आता। एक बार मैंने कॉकटेल में मौजूद अल्कोहल की मात्रा की गणना की थी, तो अल्कोहल पेय की कुल मात्रा से भी ज़्यादा निकल गया था, और मैं काफ़ी घबरा गया था।

 
khrad 2025-02-19

यह हर बार ऑपरेटर दबाने पर पिछला expression तुरंत calculate होने वाली सामान्य इलेक्ट्रॉनिक calculator की working को follow करता है, क्या आपने सिर्फ scientific calculator ही इस्तेमाल किया है?

 
ned0909 2025-02-18

पूरी तरह सहमत हूँ। सोचा था कि server नहीं है तो calculator से शुरुआत करना आसान होगा, लेकिन निकलकर आने वाली calculation errors और bugs को पकड़ने में बहुत मेहनत करनी पड़ी।

 
aer0700 2025-02-17

"Calculator app? अरे, वो तो कोई भी बना सकता है न" → असल में ऐसा नहीं है
इसे apply करने की संभावनाएँ तो अनगिनत लग रही हैं, हाहा

"Python? एकदम आसान है न" → असल में ऐसा नहीं है

 
tsboard 2025-02-17

मुझे भी देखते हुए यही विचार आया। हाहा

"JavaScript? एकदम आसान है" → असल में ऐसा नहीं है

 
joyfui 2025-02-17

"(10^100)+1−(10^100)"
ओह, सच में iPhone Calculator में 0 दिखता है, और Android Calculator में 1।
लेकिन Google पर खोजने पर तो 0 ही दिख रहा है...

 
GN⁺ 2025-02-17
Hacker News राय
  • दिलचस्प कहानी है। संख्याओं को दर्शाने का एक ज्यादा शक्तिशाली तरीका continued fractions के रूप में उन्हें व्यक्त करना है। continued fractions वास्तविक संख्याओं और परिमेय संख्याओं को कुशलता से व्यक्त कर सकते हैं
    • मज़ेदार बात यह है कि बहुत पुराने नहीं रहे गणित के पाठ्यपुस्तकों के अनुसार, continued fractions के लिए जोड़/गुणा एल्गोरिदम शायद मौजूद नहीं हैं। लेकिन 1972 में Bill Gosper ने साबित किया कि continued fractions arithmetic के लिए पूरी तरह उपयुक्त हैं
    • मैं reals नाम की एक Python लाइब्रेरी पर काम कर रहा हूँ। यह लाइब्रेरी Decimal या Fraction types की जगह लेने के लिए डिज़ाइन की गई है। यह Bill Gosper की तकनीकों का उपयोग करके continued fractions को manipulate करती है
  • यह दुर्भाग्यपूर्ण है कि link छोटा होकर क्लिक करने लायक नहीं रहा। यहाँ paper का असली link है
  • शीर्षक पढ़ते ही हँसी आ गई। IEEE 754 सबसे खराब है, लेकिन बाकी सभी विकल्पों से बेहतर है। उदाहरण देखते ही मैंने सोचा कि यह Kahan summation या कोई पूरा computer algebra system होगा। Recursive Real Arithmetic के बारे में पहले कभी नहीं सुना था
    • इससे शुरुआती C++ नायकों में से एक के बारे में कुछ insight मिली। यह याद दिलाता है कि जो चीजें सरल दिखती हैं, वे कितनी गहरी हो सकती हैं
  • NYC subway का किराया $2.90 है। iOS पर PCalc का उपयोग करके जब मैंने बची हुई MetroCard value निकाली, तो 0 की जगह -8.881784197E-16 मिला। Apple के calculator का उपयोग करने पर ऐसा नहीं होता
    • डेवलपर से पूछने पर जवाब मिला कि Apple अपनी खुद की math library का उपयोग करता है, और इसे बदलने के लिए कोई दूसरी library ढूँढ़नी होगी
  • लगभग किसी ने भी सचमुच का पूरा calculator app नहीं बनाया है। मतलब TI-89 जैसा पूरा calculator
    • मैं Android पर TI-89 calculator emulator इस्तेमाल कर रहा हूँ। इसमें Android apps की आधी features भी नहीं हैं और यह ठीक से काम भी नहीं करता
  • RRA पर स्विच करने का नुकसान सिर्फ user experience तक सीमित नहीं है। जब परिणाम 0.0000000... हो, तो calculator यह तय नहीं कर पाता कि उस संख्या का reciprocal निकाला जा सकता है या नहीं
    • उदाहरण के लिए, 1/(atan(1/5)-atan(1/239)-pi/4) "गणना नहीं की जा सकती" दिखाता है। 1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000)) आज़माने पर भी यह अब भी "गणना नहीं की जा सकती" दिखाता है
  • लगभग कोई भी संख्या IEEE floating point में व्यक्त नहीं की जा सकती। किसी random संख्या के सैद्धांतिक रूप से वर्णनीय न होने की संभावना लगभग 100% हो सकती है
    • कुछ समस्याओं से bignums का उपयोग करके बचा जा सकता है। एक पल की अस्तित्वगत घबराहट दूर हो गई
  • क्या कोई जानता है कि उन्नत TI calculators, जैसे TI-92, इस system का उपयोग करते थे? उसमें एक 'परिमेय संख्या' mode था, इसलिए संभव है कि उसने RRA का उपयोग किया हो
  • "recursive real arithmetic" (RRA) का उपयोग करने का तरीका मुझे Conal Elliot के साथ हुई एक शानदार चर्चा की याद दिलाता है। बात यह थी कि चीजों को discrete रूप में व्यक्त करने से continuous रूप में व्यक्त करने की ओर जाना
    • उदाहरण के लिए, पहले fonts को pixel blocks के रूप में दर्शाया जाता था, लेकिन अब उन्हें lines/vectors के रूप में समझा जाता है। computer science का मतलब सिर्फ नवीनतम commercial tools सीखना नहीं, बल्कि सत्य की खोज भी होना चाहिए
  • मैंने Android Open Source Project के calculator source code के साथ थोड़ा प्रयोग किया है। Google ने इसे Google Play Services में migrate कर दिया है, लेकिन पुराना source अब भी उपलब्ध है
    • यह कुछ वास्तविक समस्याएँ हल करता है, और उम्मीद है कि यह library में उपयोग के लिए उपलब्ध होगा। पिछले लेख में कुछ libraries पर चर्चा हुई थी