1. वास्तविक संख्याओं का पूर्णांक बनाना

जैसा कि हमने पहले ही चर्चा की है, जब एक वास्तविक संख्या को एक intचर के लिए निर्दिष्ट किया जाता है, तो इसे हमेशा निकटतम छोटे पूर्णांक तक गोल किया जाता है - भिन्नात्मक भाग को बस छोड़ दिया जाता है।

लेकिन ऐसी स्थिति की कल्पना करना आसान है जब किसी भिन्नात्मक संख्या को किसी भी दिशा में निकटतम पूर्णांक तक गोल करने की आवश्यकता होती है या गोल भी किया जाता है। आप इस मामले में क्या करते हैं?

इसके लिए और इसी तरह की कई स्थितियों के लिए, जावा में क्लास है Math, जिसमें round(),, ceil()और floor()मेथड्स हैं।


Math.round()तरीका

विधि Math.round()किसी संख्या को निकटतम पूर्णांक तक ले जाती है:

long x = Math.round(real_number)

लेकिन यहां एक और अति सूक्ष्म अंतर है: यह विधि एक longपूर्णांक (नहीं एक int) देता है। क्योंकि वास्तविक संख्या बहुत बड़ी हो सकती है, जावा के रचनाकारों ने जावा के सबसे बड़े उपलब्ध पूर्णांक प्रकार का उपयोग करने का निर्णय लिया: long.

तदनुसार, यदि कोई प्रोग्रामर एक चर को परिणाम निर्दिष्ट करना चाहता है int, तो उसे संकलक को स्पष्ट रूप से संकेत देना चाहिए कि वह डेटा के संभावित नुकसान को स्वीकार करता है (इस घटना में परिणामी संख्या एक intप्रकार में फिट नहीं होती है)।

int x = (int) Math.round(real_number)

उदाहरण:

कथन परिणाम
int x = (int) Math.round(4.1);
4
int x = (int) Math.round(4.5);
5
int x = (int) Math.round(4.9);
5

Math.ceil()तरीका

विधि Math.ceil()एक संख्या को एक पूर्णांक तक गोल करती है। यहाँ उदाहरण हैं:

कथन परिणाम
int x = (int) Math.ceil(4.1);
5
int x = (int) Math.ceil(4.5);
5
int x = (int) Math.ceil(4.9);
5

Math.floor()तरीका

विधि Math.floor()एक संख्या को एक पूर्णांक तक नीचे ले जाती है। यहाँ उदाहरण हैं:

कथन परिणाम
int x = (int) Math.floor(4.1);
4
int x = (int) Math.floor(4.5);
4
int x = (int) Math.floor(4.9);
4

बेशक, जब किसी संख्या को पूर्णांक में गोल करते हैं, तो टाइप कास्ट ऑपरेटर का उपयोग करना आसान होता है :(int)

कथन परिणाम
int x = (int) 4.9
4

यदि आपको इन नामों को याद रखने में कठिनाई हो रही है, तो अंग्रेजी का एक छोटा पाठ मदद करेगा:

  • Mathमतलब गणित
  • Roundमतलब गोल
  • Ceilingमतलब छत
  • Floorमतलब मंजिल

2. फ़्लोटिंग-पॉइंट नंबर कैसे संरचित होते हैं

प्रकार से तक की doubleश्रेणी में मानों को संग्रहीत कर सकता है । मूल्यों की इस विशाल श्रृंखला ( प्रकार की तुलना में) को इस तथ्य से समझाया गया है कि प्रकार (साथ ही ) में पूर्णांक प्रकारों की तुलना में पूरी तरह से अलग आंतरिक संरचना है। आंतरिक रूप से, प्रकार इसके मान को दो संख्याओं के रूप में एन्कोड करता है: पहले को मंटिसा कहा जाता है , और दूसरे को प्रतिपादक कहा जाता है ।-1.7*10308+1.7*10308intdoublefloatdouble

मान लें कि हमारे पास संख्या है 123456789और इसे एक doubleचर के रूप में संग्रहीत करें। जब हम करते हैं, तो संख्या में परिवर्तित हो जाती है , और आंतरिक रूप से प्रकार दो संख्याओं को संग्रहीत करता है - और । महत्व ("संख्या का महत्वपूर्ण हिस्सा" या मंटिसा) लाल रंग में हाइलाइट किया गया है, जबकि एक्सपोनेंट नीले रंग में हाइलाइट किया गया है।1.23456789*108double234567898

यह दृष्टिकोण बहुत बड़ी संख्या और बहुत छोटी संख्या दोनों को संग्रहीत करना संभव बनाता है। लेकिन क्योंकि संख्या का प्रतिनिधित्व 8 बाइट्स (64 बिट्स) तक सीमित है और कुछ बिट्स एक्सपोनेंट को स्टोर करने के लिए उपयोग किए जाते हैं (साथ ही मंटिसा का संकेत और एक्सपोनेंट का संकेत), मंटिसा का प्रतिनिधित्व करने के लिए उपलब्ध अधिकतम अंक 15 है ।

यह एक बहुत ही सरल विवरण है कि वास्तविक संख्याएँ कैसे संरचित की जाती हैं।


3. वास्तविक संख्याओं के साथ काम करते समय परिशुद्धता का नुकसान

वास्तविक संख्याओं के साथ काम करते समय, हमेशा ध्यान रखें कि वास्तविक संख्याएँ सटीक नहीं होती हैं । दशमलव से बाइनरी में परिवर्तित करते समय हमेशा राउंडिंग त्रुटियाँ और रूपांतरण त्रुटियाँ हो सकती हैं। इसके अतिरिक्त, मौलिक रूप से विभिन्न पैमानों पर संख्याओं को जोड़ते/घटाते समय त्रुटि का सबसे आम स्रोत सटीकता का नुकसान है।

नौसिखिए प्रोग्रामरों के लिए यह आखिरी तथ्य थोड़ा दिमाग उड़ाने वाला है।

यदि हम से घटाते हैं , तो हमें प्राप्त होता है ।1/109109109

मौलिक रूप से विभिन्न पैमानों पर संख्याओं को घटाना व्याख्या
 1000000000.000000000;
-         0.000000001;
 1000000000.000000000;
दूसरी संख्या बहुत छोटी है , जिसके कारण इसका महत्व (ग्रे में हाइलाइट किया गया) नज़रअंदाज़ हो जाएगा। नारंगी में 15 महत्वपूर्ण अंक हाइलाइट किए गए हैं

हम क्या कह सकते हैं, प्रोग्रामिंग गणित के समान नहीं है।


4. वास्तविक संख्याओं की तुलना करते समय गड़बड़ी

एक और खतरा प्रोग्रामर के इंतजार में है जब वे वास्तविक संख्याओं की तुलना करते हैं। वास्तविक संख्याओं के साथ काम करते समय यह उत्पन्न होता है, क्योंकि राउंड-ऑफ त्रुटियां जमा हो सकती हैं। इसका परिणाम यह होता है कि ऐसी स्थितियाँ आती हैं जब वास्तविक संख्याओं के बराबर होने की उम्मीद की जाती है, लेकिन ऐसा नहीं होता है। या इसके विपरीत: संख्याओं के अलग-अलग होने की उम्मीद है, लेकिन वे समान हैं।

उदाहरण:

कथन व्याख्या
double a = 1000000000.0;
double b = 0.000000001;
double c = a - b;
चर का मान a होगा 1000000000.0
चर का मान c होगा 1000000000.0
(चर में संख्या b अत्यधिक छोटी है)

उपरोक्त उदाहरण में, aऔर cसमान नहीं होना चाहिए, लेकिन वे हैं।

या चलिए एक और उदाहरण लेते हैं:

कथन व्याख्या
double a = 1.00000000000000001;
double b = 1.00000000000000002;
चर का मान a होगा 1.0
चर का मान b होगा1.0

5. के बारे में एक रोचक तथ्यstrictfp

जावा में एक विशेष strictfpकीवर्ड ( सख्त f ​​loating p oint ) है, जो अन्य प्रोग्रामिंग भाषाओं में नहीं पाया जाता है। और क्या आप जानते हैं कि आपको इसकी आवश्यकता क्यों है? यह फ़्लोटिंग-पॉइंट नंबरों के साथ संचालन की सटीकता को खराब करता है । यह कैसे हुआ इसकी कहानी यहां दी गई है:

जावा के निर्माता:
हम वास्तव में चाहते हैं कि जावा अत्यधिक लोकप्रिय हो और जितना संभव हो उतने उपकरणों पर जावा प्रोग्राम चलाए। इसलिए हमने सुनिश्चित किया कि जावा मशीन के लिए विनिर्देश कहता है कि सभी प्रोग्राम सभी प्रकार के उपकरणों पर समान तरीके से चलने चाहिए !
इंटेल प्रोसेसर के निर्माता:
सुनिये सब लोग! हमने अपने प्रोसेसर में सुधार किया है, और अब हमारे प्रोसेसर के अंदर 8-बाइट्स के बजाय 10-बाइट्स का उपयोग करके सभी वास्तविक संख्याओं का प्रतिनिधित्व किया जाता है। अधिक बाइट्स का अर्थ है अधिक महत्वपूर्ण अंक। इसका क्या मतलब है? यह सही है! अब आपकी वैज्ञानिक गणनाएं और भी सटीक होंगी!
अति-सटीक गणनाओं में शामिल वैज्ञानिक और सभी लोग:
ठंडा! बहुत अच्छा। उत्कृष्ट खबर!
जावा के निर्माता:
नहीं-नहीं-नहीं, तुम लोग! हम आपको पहले ही बता चुके हैं कि सभी जावा प्रोग्राम को सभी उपकरणों पर समान रूप से चलना चाहिए । हम इंटेल प्रोसेसर के अंदर 10-बाइट वास्तविक संख्या का उपयोग करने की क्षमता को जबरन अक्षम करने जा रहे हैं।
अब फिर से सब ठीक है! हमें धन्यवाद मत दो।
अति-सटीक गणनाओं में शामिल वैज्ञानिक और सभी लोग:
क्या तुम बिल्कुल पागल हो गए हो? जल्दी से सब कुछ पहले जैसा हो जाए!
जावा के निर्माता:
दोस्तों, यह आपके भले के लिए है! ज़रा कल्पना करें: सभी जावा प्रोग्राम सभी उपकरणों पर समान तरीके से चलते हैं । कि बहुत अच्छा है!
अति-सटीक गणनाओं में शामिल वैज्ञानिक और सभी लोग:
नहीं, यह बिल्कुल भी अच्छा नहीं है। जल्दी से सब कुछ वापस कर दो जैसा था! या पता है कि हम आपका जावा कहाँ रखेंगे?
जावा के निर्माता:
हम्म। आपने तुरंत ऐसा क्यों नहीं कहा? बेशक, हम इसे वापस रख देंगे।
हमने नवीनतम प्रोसेसर की सभी विशेषताओं का उपयोग करने की आपकी क्षमता को बहाल कर दिया है।
वैसे... हमने विशेष रूप से strictfpभाषा में कीवर्ड भी जोड़ा है। यदि आप इसे किसी फ़ंक्शन के नाम से पहले लिखते हैं, तो उस फ़ंक्शन के अंदर वास्तविक संख्याओं से जुड़े सभी ऑपरेशन सभी उपकरणों पर समान रूप से खराब होंगे !