C भाषा मा फ्लोटिंग पोइन्ट र दशमलवको ह्यान्डलिंग | आधारदेखि व्यवहारसम्म

目次

1. C भाषा मा दशमलव बिन्दु प्रयोग गर्दा आधारभूत ज्ञान र महत्व

C भाषा एक कम स्तरको नियन्त्रण सम्भव गर्ने प्रोग्रामिङ भाषा हो, विशेष गरी संख्यात्मक गणनाको शुद्धता र कार्यक्षमता कडाइका साथ नियन्त्रण गर्न आवश्यक पर्ने परिस्थितिहरूमा प्रयोग गरिन्छ। यसमा, दशमलव बिन्दु पछिका संख्याहरूलाई ठीकसँग ह्यान्डल गर्नु अत्यन्त महत्वपूर्ण छ। फ्लोटिङ पोइन्ट संख्या (दशमलव सहितका संख्याहरू) को गणना र प्रदर्शन विज्ञान‑प्रविधि गणना, वित्तीय क्षेत्र, ग्राफिक प्रोसेसिङ आदि धेरै परिस्थितिहरूमा आवश्यक पर्छ, तर C भाषामा दशमलव बिन्दु प्रयोग गर्दा केही बुँदा र सावधानीहरू छन्।

किन दशमलव बिन्दु पछिको ह्यान्डलिंग महत्वपूर्ण छ?

दशमलव बिन्दु समावेश गर्ने गणनालाई ठीकसँग गर्नु विशेष गरी तलका परिस्थितिहरूमा अनिवार्य छ:

  • विज्ञान‑प्रविधि गणना: सिमुलेशन वा भौतिक गणनाहरू जस्ता साना त्रुटिहरूले अन्तिम परिणाममा ठूलो प्रभाव पार्न सक्छ।
  • वित्तीय गणना: शेयर वा विनिमय जस्ता गणनाहरूमा दशमलव बिन्दु पछिको अंकसंख्या प्रति संवेदनशील हुन्छ, र शुद्ध संख्यात्मक प्रक्रिया आवश्यक छ।
  • ग्राफिक गणना: कम्प्युटर खेल वा CG निर्माणमा, फ्लोटिङ पोइन्ट गणना सटीक स्थान र आकारको गणनामा प्रयोग हुन्छ।

C भाषामा, संख्यात्मक प्रतिनिधित्वका लागि float, double, long double का तीन प्रकारका फ्लोटिङ पोइन्ट प्रकारहरू उपलब्ध छन्। यी प्रकारहरू विभिन्न शुद्धता र मेमोरी प्रयोगसँग सम्बन्धित छन्, र प्रयोग अनुसार उपयुक्त चयन आवश्यक हुन्छ। उपयुक्त प्रकार चयन नगरेमा, मेमोरीको बर्बादी वा गणनाको शुद्धताको अभावले त्रुटि उत्पन्न हुन सक्छ।

यस लेखको उद्देश्य र सामग्री

यस लेखमा, C भाषामा दशमलव बिन्दुलाई ठीकसँग ह्यान्डल गर्ने आधारभूत विधिबाट उन्नत प्रविधिहरू सम्म, प्रणालीगत रूपमा व्याख्या गरिनेछ। फ्लोटिङ पोइन्ट डेटा प्रकारको आधारभूत ज्ञानबाट सुरु गरी, वास्तविक गणना र प्रदर्शन विधि, शुद्धता नियन्त्रण गर्ने तरिका, मानक पुस्तकालयको उपयोगसम्म व्यापक रूपमा समेटिनेछ। साथै, शुद्धताको सीमा र गोलाइ त्रुटिहरू सम्बन्धी सावधानीहरू पनि व्याख्या गरिनेछ।

यस लेख मार्फत, तलका ज्ञानहरू हासिल गर्न सक्नुहुन्छ:

  • प्रत्येक फ्लोटिङ पोइन्ट प्रकारको विशेषता र प्रयोग विभाजनको तरिका
  • printf कार्यलाई प्रयोग गरेर दशमलव बिन्दु पछिको अंकसंख्या निर्दिष्ट गर्ने र प्रदर्शन गर्ने तरिका
  • फ्लोटिङ पोइन्ट गणना गर्दा शुद्धता र त्रुटिहरूको सावधानी र उपायहरू
  • मानक पुस्तकालयको उपयोग गरेर जटिल संख्यात्मक गणनाको कार्यक्षमता वृद्धि

यस लेखको सामग्रीलाई मास्टर गरेर, C भाषामा उच्च शुद्धताको दशमलव बिन्दु प्रक्रिया हासिल गर्न सकिन्छ, जसले अधिक विश्वसनीय कार्यक्रमहरू निर्माण गर्न मद्दत गर्छ।

2. C भाषा मा फ्लोटिङ पोइन्ट प्रकारहरूको सारांश

C भाषामा, दशमलव बिन्दुहरूलाई ह्यान्डल गर्दा floatdouble、र long double का तीन प्रकारका फ्लोटिङ पोइन्ट प्रकारहरू प्रयोग गरिन्छ। प्रत्येक डेटा प्रकारको अलग शुद्धता र मेमोरी प्रयोग हुन्छ, र प्रयोगको उद्देश्य तथा गणनाको शुद्धताका आधारमा तिनीहरूलाई छनोट गर्न आवश्यक पर्छ। यहाँ, प्रत्येक डेटा प्रकारको विशेषताहरू र वास्तविक रूपमा कुन परिस्थितिमा प्रयोग गर्नु उपयुक्त हुन्छ भन्ने बारेमा व्याख्या गरिएको छ।

2.1 float प्रकार

float प्रकारले 32 बिट मेमोरी प्रयोग गर्छ, लगभग 7 अंकको शुद्धता भएको फ्लोटिङ पोइन्ट प्रकार हो।float प्रकार, स्रोतमा प्रतिबन्ध भएका एम्बेडेड सिस्टमहरूमा वा थोरै त्रुटि समस्या नहुने गणनामा प्राय प्रयोग गरिन्छ।

#include <stdio.h>

int main() {
    float num = 3.1415926535f;
    printf("float प्रकारको मान (दशमलवको 7 अंक): %.7f
", num);
    return 0;
}

आउटपुट परिणाम:

float प्रकारको मान (दशमलवको 7 अंक): 3.141593

float प्रकार मेमोरी प्रयोग कम भएको कारण, स्रोत सीमित वातावरणमा प्रभावकारी हुन्छ, तर शुद्धता आवश्यक परेमा उपयुक्त छैन। उदाहरणका लागि, साधारण ग्राफिक प्रोसेसिङ वा रियल‑टाइम गणनामा उपयोगी हुन्छ।

2.2 double प्रकार

double प्रकारले 64 बिट मेमोरी प्रयोग गर्छ, लगभग 15 अंकको शुद्धता हुन्छ। यो प्रकार C भाषामा सबैभन्दा सामान्य प्रयोग हुने फ्लोटिङ पोइन्ट प्रकार हो, र धेरै वैज्ञानिक‑प्राविधिक गणना तथा सामान्य संख्यात्मक गणनाहरूलाई समर्थन गर्न सक्छ।double प्रकार शुद्धता र कार्यक्षमताको सन्तुलन भएको कारण, धेरै अनुप्रयोगहरूमा मानकको रूपमा अपनाइएको छ।

#include <stdio.h>

int main() {
    double num = 3.141592653589793;
    printf("double प्रकारको मान (दशमलवको 15 अंक): %.15f
", num);
    return 0;
}

आउटपुट परिणाम:

double प्रकारको मान (दशमलवको 15 अंकसम्म): 3.141592653589793

double प्रकार संख्यात्मक गणनाको शुद्धता आवश्यक पर्ने परिस्थितिहरूमा अत्यन्त उपयोगी हुन्छ। वित्तीय गणना वा उच्च‑सटीक मेसिन सिमुलेशन जस्ता, उच्च विश्वसनीयता परिणाम आवश्यक पर्ने प्रोग्रामहरूमा मुख्यतया प्रयोग गरिन्छ।

2.3 long double प्रकार

long double प्रकार सामान्यतया 128 बिट मेमोरी प्रयोग गर्छ, र धेरैजसो 18 अंकभन्दा बढी शुद्धता हुन्छ (प्रणाली वा कम्पाइलर अनुसार फरक हुन सक्छ)। शुद्धता विशेष गरी महत्वपूर्ण हुने गणनाहरूमा उपयुक्त छ, र भौतिक सिमुलेशन वा उच्च‑सटीक डेटा विश्लेषणमा प्रयोग गरिन्छ।

#include <stdio.h>

int main() {
    long double num = 3.141592653589793238462643383279L;
    printf("long double प्रकारको मान (दशमलवको 18 अंकसम्म): %.18Lf
", num);
    return 0;
}

आउटपुट परिणाम:

long double प्रकार मान (दशमलवको 18 अंकसम्म): 3.141592653589793238

long double प्रकार double प्रकारभन्दा बढी शुद्धता आवश्यक पर्ने केसहरूमा प्रयोग गरिन्छ। वैज्ञानिक गणना वा उच्च‑शुद्धता वित्तीय सिमुलेशन जस्ता, त्रुटिको संचयलाई सकेसम्म घटाउन चाहिने क्षेत्रहरूमा प्रभावकारी हुन्छ।

2.4 डेटा प्रकार चयन मानदण्ड र प्रयोगहरू

तल प्रत्येक डेटा प्रकारको विशेषता र प्रयोगको तुलना दिइएको छ। प्रयोगको आधारमा उपयुक्त डेटा प्रकार चयन गरेर, मेमोरी दक्षता र गणनाको शुद्धता अनुकूलन गर्न सकिन्छ।

डेटा प्रकारमेमोरी आकारशुद्धता (मान्य अंक)मुख्य प्रयोग
float32 बिटलगभग 7 अंकस्रोत सीमित एम्बेडेड सिस्टम, रियल‑टाइम गणना
double64 बिटलगभग 15 अंकसामान्य संख्यात्मक गणना तथा वैज्ञानिक‑प्राविधिक गणना
long double128 बिट18 अंकभन्दा बढीउच्च शुद्धता आवश्यक पर्ने गणना, वैज्ञानिक क्षेत्र तथा उच्च‑शुद्धता वित्तीय विश्लेषण

उपयुक्त डेटा प्रकार चयन गर्ने बिन्दुहरू

  • शुद्धता आवश्यक छ कि छैन: शुद्धता आवश्यक पर्ने गणनामा double वा long double उपयुक्त हुन्छ, र यदि आवश्यक नपरेमा मेमोरी दक्षता विचार गरेर float प्रभावकारी हुन्छ।
  • प्रणालीको स्रोत प्रतिबन्ध: एम्बेडेड सिस्टम जस्ता मेमोरी प्रतिबन्ध कडा हुने वातावरणमा, float प्रकारलाई प्राथमिकता दिनुले दक्षता बढाउँछ।
  • गणना गति र शुद्धताको सन्तुलन: धेरै प्रोग्रामहरूमा double प्रकारलाई मानक मानिन्छ, र शुद्धता तथा मेमोरी दक्षताको सन्तुलन भएको कारण सिफारिस गरिन्छ।

3. दशमलव बिन्दु पछिको अंक संख्या निर्दिष्ट गरेर प्रदर्शन गर्ने तरिका

C भाषा को printf कार्यले, फ्लोटिङ पोइन्ट संख्याको दशमलव बिन्दु पछिको अंक संख्या निर्दिष्ट गरेर आउटपुट गर्न सक्ने सुविधाजनक कार्यक्षमता प्रदान गर्दछ। प्रदर्शनको अंक संख्या र ढाँचा समायोजन गरेर, संख्यात्मक डेटा को पढ्न सजिलोपन र शुद्धता सुधार गर्न सम्भव हुन्छ। यस भागमा, विभिन्न ढाँचा निर्दिष्ट गर्ने तरिकाहरू र तिनीहरूको प्रयोग उदाहरणहरू व्याख्या गरिन्छ।

3.1 आधारभूत स्वरूप निर्दिष्ट: %.nf

दशमलव बिन्दु पछिको अंक संख्या निर्दिष्ट गर्न, स्वरूप निर्दिष्टकर्ता %.nf प्रयोग गरिन्छ। यहाँ, n मा प्रदर्शन गर्ने अंक संख्या निर्दिष्ट गरिन्छ। उदाहरणका लागि, दशमलव बिन्दु पछिको 2 अंक वा 4 अंकमा संख्या प्रदर्शन गर्न चाहनुहुन्छ भने, तलको कोड जस्तै निर्दिष्ट गर्न सकिन्छ।

#include <stdio.h>

int main() {
    float number = 123.456789;
    printf("दशमलवको 2 अंक: %.2fn", number);
    printf("दशमलवको 4 अंक: %.4fn", number);
    return 0;
}

आउटपुट परिणाम तलको जस्तै हुन्छ।

दशमलवको 2 अंक: 123.46
दशमलवको 4 अंक: 123.4568

यसरी, %.2f%.4f प्रयोग गर्दा, दशमलव बिन्दु पछिको निर्दिष्ट अंक संख्यामा प्रदर्शन हुन्छ, र गोलाइ गरिन्छ, जसले पढ्न सजिलो परिणाम प्राप्त हुन्छ। यो विधि विज्ञान‑प्रविधि गणना वा वित्तीय रिपोर्ट जस्ता, सटीक अंक संख्यामा आउटपुट आवश्यक पर्ने परिस्थितिहरूमा उपयोगी हुन्छ।

3.2 घातांक स्वरूपमा अंक संख्या निर्दिष्ट: %.ne र %.nE

फ्लोटिङ पोइन्ट संख्यालाई घातांक स्वरूपमा प्रदर्शन गर्न चाहनुहुन्छ भने, %.ne वा %.nE प्रयोग गर्नुहोस्। सानो अक्षरको e प्रयोग गर्दा सानो अक्षरको घातांक स्वरूप, ठूलो अक्षरको E प्रयोग गर्दा ठूलो अक्षरको घातांक स्वरूपमा आउटपुट हुन्छ।

#include <stdio.h>

int main() {
    float number = 123.456789;
    printf("घातांक स्वरूप (दशमलवको 2 अंक): %.2en", number);
    printf("घातांक स्वरूप (दशमलवको 4 अंक): %.4En", number);
    return 0;
}

यो प्रोग्राम चलाउँदा, तलको जस्तै आउटपुट प्राप्त हुन्छ।

घाताङ्क रूप (दशमलवको २ अंक): 1.23e+02
घाताङ्क रूप (दशमलवको ४ अंक): 1.2346E+02

घातांक स्वरूप अत्यन्त ठूलो वा सानो संख्याहरूलाई ह्यान्डल गर्दा प्रभावकारी हुन्छ। यसले संख्यालाई छोटो रूपमा देखाउँछ, र पढ्न सजिलो बनाउँछ।

3.3 स्वचालित चयन स्वरूप: %.ng र %.nG

संख्याको आकार अनुसार, सामान्य स्वरूप र घातांक स्वरूपलाई स्वचालित रूपमा स्विच गर्ने तरिका रूपमा, %.ng वा %.nG प्रयोग गर्न सकिन्छ। निर्दिष्ट अंक संख्याअनुसार, उपयुक्त स्वरूप स्वचालित रूपमा चयन हुन्छ, जसले पढ्न सजिलोता नघटाई विभिन्न संख्याहरू प्रदर्शन गर्न सम्भव बनाउँछ।

#include <stdio.h>

int main() {
    float number1 = 123.456789;
    float number2 = 0.0000123456789;
    printf("स्वचालित चयन प्रारूप (दशमलव बिन्दु पछि 2 अंक): %.2gn", number1);
    printf("स्वचालित चयन प्रारूप (दशमलव बिन्दु पछि 4 अंक): %.4gn", number2);
    return 0;
}

आउटपुट परिणाम:

स्वचालित चयन ढाँचा (दशमलवको २ अंक): 1.2e+02
स्वचालित चयन ढाँचा (दशमलवको ४ अंक): 1.235e-05

यसरी %.2g वा %.4g प्रयोग गर्दा, दशमलव बिन्दु पछिको अंक संख्या स्वचालित रूपमा उपयुक्त प्रदर्शन स्वरूपमा चयन हुन्छ, र विभिन्न संख्याहरूको लागि पढ्न सजिलो परिणाम प्राप्त हुन्छ।

3.4 अनुप्रयोग उदाहरण: स्वरूप निर्दिष्ट र शून्य भर्नु प्रदर्शन

डेटा सँगै देखाउन चाहनुहुन्छ भने, सम्पूर्ण अंक संख्या निर्दिष्ट गरेर शून्य भर्न सकिन्छ। उदाहरणका लागि, %07.3f जस्तै निर्दिष्ट गर्दा, संख्या दशमलव बिन्दु पछिको 3 अंकमा देखाइन्छ, र कुल चौडाइ 7 अंक हुने सम्म अगाडि शून्यहरू भर्नु हुन्छ।

#include <stdio.h>

int main() {
    float number1 = 1.001;
    printf("शून्य भरेको निर्दिष्ट (चौडाइ ७, दशमलव ३ अंक): %07.3fn", number1);
    return 0;
}

आउटपुट:

शून्य भरेको निर्दिष् (चौडाई 7, दशमलवको 3 अंक): 001.001

यो विधि विशेष गरी संख्याको क्रमबद्धता आवश्यक पर्ने परिस्थितिहरूमा उपयोगी हुन्छ, र संख्यात्मक सूची वा तालिका स्वरूपको आउटपुटमा पढ्न सजिलोता सुनिश्चित गर्न मद्दत गर्दछ।

4. फ्लोटिङ पोइन्ट गणनामा ध्यान दिनुपर्ने बुँदाहरू

C भाषामा फ्लोटिङ पोइन्ट संख्याहरूलाई प्रयोग गर्दा, राउन्डिङ त्रुटि र शुद्धताको सीमा जस्ता विभिन्न ध्यान दिनुपर्ने बुँदाहरू हुन्छन्। यदि यीलाई बेवास्ता गरियो भने, गणनाको परिणाममा अनपेक्षित त्रुटि उत्पन्न हुन सक्छ र प्रोग्रामको विश्वसनीयतामा असर पर्न सक्छ। यस खण्डमा, फ्लोटिङ पोइन्ट संख्याहरूको गणना गर्दा विशेष गरी ध्यान दिनुपर्ने बुँदाहरू र तिनीहरूको समाधानबारे विस्तृत रूपमा व्याख्या गरिनेछ।

4.1 राउन्डिङ त्रुटि के हो?

फ्लोटिङ पोइन्ट संख्याहरू सीमित बिट संख्यामा प्रतिनिधित्व गरिनुका कारण, गणनाको परिणाम सटीक मान नहुन सक्छ र थोरै फरक मान हुन सक्छ। यसलाई राउन्डिङ त्रुटि भनिन्छ, र विशेष गरी दशमलव बिन्दु पछिका अंकहरू लामो हुँदा प्रभाव ठूलो हुन्छ। उदाहरणका लागि, 0.1 + 0.2 को परिणाम सैद्धान्तिक रूपमा 0.3 हुनुपर्छ, तर व्यावहारिक रूपमा फरक मान देखिन सक्छ।

#include <stdio.h>

int main() {
    float a = 0.1f;
    float b = 0.2f;
    float sum = a + b;
    printf("राउन्डिङ त्रुटिको असर: %fn", sum); // आउटपुट आदर्श 0.3 जस्तै नहुन सक्छ
    return 0;
}

यस उदाहरण जस्तै, राउन्डिङ त्रुटि उत्पन्न भएमा गणनाको परिणाम अपेक्षित मानसँग फरक हुन सक्छ। यो त्रुटि दोहोर्याइने गणना वा संचयी गणनामा विशेष गरी स्पष्ट हुन्छ।

4.2 शुद्धताको सीमा र यसको प्रभाव

फ्लोटिङ पोइन्ट प्रकारहरूमा प्रत्येकको शुद्धताको सीमा हुन्छ। उदाहरणका लागि, float प्रकारले लगभग 7 अंक, double प्रकारले लगभग 15 अंक, long double प्रकारले 18 अंकभन्दा बढी शुद्धता प्रदान गर्छ, तर अत्यधिक ठूलो वा सानो संख्याहरूलाई ह्यान्डल गर्दा त्रुटि उत्पन्न हुन सजिलो हुन्छ।

#include <stdio.h>

int main() {
    double largeValue = 1.0e308;
    double smallValue = 1.0e-308;
    double result = largeValue + smallValue;
    printf("सटीकताको सीमा: %lfn", result); // छोटो मानहरूलाई अनदेखा गरिने सम्भावना हुन्छ
    return 0;
}

उपरोक्त कोडमा, 1.0e308 जस्तो ठूलो संख्या र 1.0e-308 जस्तो सानो संख्या जोडिएको छ, तर smallValue गणनामा प्रतिबिम्बित हुँदैन, जसले शुद्धताको कमी देखाउँछ। अत्यधिक मानहरूको जोड वा घटाउ गर्दा, शुद्धताको सीमालाई बुझेर उपयुक्त डेटा प्रकार चयन गर्न आवश्यक हुन्छ।

4.3 फ्लोटिङ पोइन्ट संख्याहरूको तुलना विधि

फ्लोटिङ पोइन्ट संख्याहरूको प्रत्यक्ष तुलना गर्दा, राउन्डिङ त्रुटिको प्रभावले अपेक्षित परिणाम नआउन सक्छ, त्यसैले प्रत्यक्ष तुलना टाल्नुपर्छ। उदाहरणका लागि, 0.1 + 0.2 लाई 0.3 सँग तुलना गर्दा, त्रुटिको कारणले “बराबर छैन” भन्ने निर्णय हुन सक्छ। यस्तो अवस्थामा, इप्सिलन (epsilon) भनिने सानो मान प्रयोग गरेर तुलना गर्नु प्रभावकारी हुन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double d = 0.1;
    double e = 0.2;
    double f = d + e;
    double epsilon = 1e-9;

    if (fabs(f - 0.3) < epsilon) {
        printf("f 0.3 को धेरै नजिक छn");
    } else {
        printf("f 0.3 होइनn");
    }
    return 0;
}

यस उदाहरणमा, fabs(f - 0.3) < epsilon शर्त प्रयोग गरेर, f यदि 0.3 को धेरै नजिक छ भने “बराबर” भनेर निर्णय गरिन्छ। यसले त्रुटिको प्रभावलाई न्यूनतम राखी, सटीक तुलना सम्भव बनाउँछ।

4.4 दोहोर्याइने गणनामा त्रुटिको संचय

फ्लोटिङ पोइन्ट संख्याहरूलाई दोहोर्याइने लूप गणनामा प्रयोग गर्दा, राउन्डिङ त्रुटि संचय हुन्छ र गणनाको परिणाममा ठूलो प्रभाव पार्न सक्छ। उदाहरणका लागि, धेरै पटक जोड वा घटाउ गर्ने प्रक्रियामा त्रुटि सजिलै संचय हुन्छ। यदि शुद्धता आवश्यक छ भने, डेटा प्रकार चयन वा गणना विधि सुधार गरेर त्रुटि घटाउन सकिन्छ।

C भाषामा फ्लोटिङ पोइन्ट संख्याहरूलाई प्रयोग गर्दा, राउन्डिङ त्रुटि र शुद्धताको सीमा जस्ता विभिन्न ध्यान दिनुपर्ने बुँदाहरू हुन्छन्। यदि यीलाई बेवास्ता गरियो भने, गणनाको परिणाममा अनपेक्षित त्रुटि उत्पन्न हुन सक्छ र प्रोग्रामको विश्वसनीयतामा असर पर्न सक्छ। यस खण्डमा, फ्लोटिङ पोइन्ट संख्याहरूको गणना गर्दा विशेष गरी ध्यान दिनुपर्ने बुँदाहरू र तिनीहरूको समाधानबारे विस्तृत रूपमा व्याख्या गरिनेछ।

4.1 राउन्डिङ त्रुटि के हो?

फ्लोटिङ पोइन्ट संख्याहरू सीमित बिट संख्यामा प्रतिनिधित्व गरिनुका कारण, गणनाको परिणाम सटीक मान नहुन सक्छ र थोरै फरक मान हुन सक्छ। यसलाई राउन्डिङ त्रुटि भनिन्छ, र विशेष गरी दशमलव बिन्दु पछिका अंकहरू लामो हुँदा प्रभाव ठूलो हुन्छ। उदाहरणका लागि, 0.1 + 0.2 को परिणाम सैद्धान्तिक रूपमा 0.3 हुनुपर्छ, तर व्यावहारिक रूपमा फरक मान देखिन सक्छ।

#include <stdio.h>

int main() {
    float a = 0.1f;
    float b = 0.2f;
    float sum = a + b;
    printf("राउन्डिङ त्रुटिको प्रभाव: %fn", sum); // आउटपुट आदर्श 0.3 नहुन सक्छ
    return 0;
}

यस उदाहरण जस्तै, राउन्डिङ त्रुटि उत्पन्न भएमा गणनाको परिणाम अपेक्षित मानसँग फरक हुन सक्छ। यो त्रुटि दोहोर्याइने गणना वा संचयी गणनामा विशेष गरी स्पष्ट हुन्छ।

4.2 शुद्धताको सीमा र यसको प्रभाव

फ्लोटिङ पोइन्ट प्रकारहरूमा प्रत्येकको शुद्धताको सीमा हुन्छ। उदाहरणका लागि, float प्रकारले लगभग 7 अंक, double प्रकारले लगभग 15 अंक, long double प्रकारले 18 अंकभन्दा बढी शुद्धता प्रदान गर्छ, तर अत्यधिक ठूलो वा सानो संख्याहरूलाई ह्यान्डल गर्दा त्रुटि उत्पन्न हुन सजिलो हुन्छ।

#include <stdio.h>

int main() {
    double largeValue = 1.0e308;
    double smallValue = 1.0e-308;
    double result = largeValue + smallValue;
    printf("सटीकताको सीमा: %lfn", result); // छोटो मानहरूलाई अनदेखा गरिने सम्भावना हुन्छ
    return 0;
}

उपरोक्त कोडमा, 1.0e308 जस्तो ठूलो संख्या र 1.0e-308 जस्तो सानो संख्या जोडिएको छ, तर smallValue गणनामा प्रतिबिम्बित हुँदैन, जसले शुद्धताको कमी देखाउँछ। अत्यधिक मानहरूको जोड वा घटाउ गर्दा, शुद्धताको सीमालाई बुझेर उपयुक्त डेटा प्रकार चयन गर्न आवश्यक हुन्छ।

4.3 फ्लोटिङ पोइन्ट संख्याहरूको तुलना विधि

फ्लोटिङ पोइन्ट संख्याहरूको प्रत्यक्ष तुलना गर्दा, राउन्डिङ त्रुटिको प्रभावले अपेक्षित परिणाम नआउन सक्छ, त्यसैले प्रत्यक्ष तुलना टाल्नुपर्छ। उदाहरणका लागि, 0.1 + 0.2 लाई 0.3 सँग तुलना गर्दा, त्रुटिको कारणले “बराबर छैन” भन्ने निर्णय हुन सक्छ। यस्तो अवस्थामा, इप्सिलन (epsilon) भनिने सानो मान प्रयोग गरेर तुलना गर्नु प्रभावकारी हुन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double d = 0.1;
    double e = 0.2;
    double f = d + e;
    double epsilon = 1e-9;

    if (fabs(f - 0.3) < epsilon) {
        printf("f 0.3 को धेरै नजिक छn");
    } else {
        printf("f 0.3 होइनn");
    }
    return 0;
}

यस उदाहरणमा, fabs(f - 0.3) < epsilon शर्त प्रयोग गरेर, f यदि 0.3 को धेरै नजिक छ भने “बराबर” भनेर निर्णय गरिन्छ। यसले त्रुटिको प्रभावलाई न्यूनतम राखी, सटीक तुलना सम्भव बनाउँछ।

4.4 दोहोर्याइने गणनामा त्रुटिको संचय

फ्लोटिङ पोइन्ट संख्याहरूलाई दोहोर्याइने लूप गणनामा प्रयोग गर्दा, राउन्डिङ त्रुटि संचय हुन्छ र गणनाको परिणाममा ठूलो प्रभाव पार्न सक्छ। उदाहरणका लागि, धेरै पटक जोड वा घटाउ गर्ने प्रक्रियामा त्रुटि सजिलै संचय हुन्छ। यदि शुद्धता आवश्यक छ भने, डेटा प्रकार चयन वा गणना विधि सुधार गरेर त्रुटि घटाउन सकिन्छ।

C भाषामा फ्लोटिङ पोइन्ट संख्याहरूलाई प्रयोग गर्दा, राउन्डिङ त्रुटि र शुद्धताको सीमा जस्ता विभिन्न ध्यान दिनुपर्ने बुँदाहरू हुन्छन्। यदि यीलाई बेवास्ता गरियो भने, गणनाको परिणाममा अनपेक्षित त्रुटि उत्पन्न हुन सक्छ र प्रोग्रामको विश्वसनीयतामा असर पर्न सक्छ। यस खण्डमा, फ्लोटिङ पोइन्ट संख्याहरूको गणना गर्दा विशेष गरी ध्यान दिनुपर्ने बुँदाहरू र तिनीहरूको समाधानबारे विस्तृत रूपमा व्याख्या गरिनेछ।

4.1 राउन्डिङ त्रुटि के हो?

फ्लोटिङ पोइन्ट संख्याहरू सीमित बिट संख्यामा प्रतिनिधित्व गरिनुका कारण, गणनाको परिणाम सटीक मान नहुन सक्छ र थोरै फरक मान हुन सक्छ। यसलाई राउन्डिङ त्रुटि भनिन्छ, र विशेष गरी दशमलव बिन्दु पछिका अंकहरू लामो हुँदा प्रभाव ठूलो हुन्छ। उदाहरणका लागि, 0.1 + 0.2 को परिणाम सैद्धान्तिक रूपमा 0.3 हुनुपर्छ, तर व्यावहारिक रूपमा फरक मान देखिन सक्छ।

#include <stdio.h>

int main() {
    float a = 0.1f;
    float b = 0.2f;
    float sum = a + b;
    printf("राउन्डिङ त्रुटिको प्रभाव: %fn", sum); // आउटपुट आदर्श 0.3 जस्तै नहुन सक्छ
    return 0;
}

यस उदाहरण जस्तै, राउन्डिङ त्रुटि उत्पन्न भएमा गणनाको परिणाम अपेक्षित मानसँग फरक हुन सक्छ। यो त्रुटि दोहोर्याइने गणना वा संचयी गणनामा विशेष गरी स्पष्ट हुन्छ।

4.2 शुद्धताको सीमा र यसको प्रभाव

फ्लोटिङ पोइन्ट प्रकारहरूमा प्रत्येकको शुद्धताको सीमा हुन्छ। उदाहरणका लागि, float प्रकारले लगभग 7 अंक, double प्रकारले लगभग 15 अंक, long double प्रकारले 18 अंकभन्दा बढी शुद्धता प्रदान गर्छ, तर अत्यधिक ठूलो वा सानो संख्याहरूलाई ह्यान्डल गर्दा त्रुटि उत्पन्न हुन सजिलो हुन्छ।

#include <stdio.h>

int main() {
    double largeValue = 1.0e308;
    double smallValue = 1.0e-308;
    double result = largeValue + smallValue;
    printf("सटीकताको सीमा: %lfn", result); // सानो मानहरूलाई अनदेखा गरिने सम्भावना हुन्छ
    return 0;
}

उपरोक्त कोडमा, 1.0e308 जस्तो ठूलो संख्या र 1.0e-308 जस्तो सानो संख्या जोडिएको छ, तर smallValue गणनामा प्रतिबिम्बित हुँदैन, जसले शुद्धताको कमी देखाउँछ। अत्यधिक मानहरूको जोड वा घटाउ गर्दा, शुद्धताको सीमालाई बुझेर उपयुक्त डेटा प्रकार चयन गर्न आवश्यक हुन्छ।

4.3 फ्लोटिङ पोइन्ट संख्याहरूको तुलना विधि

फ्लोटिङ पोइन्ट संख्याहरूको प्रत्यक्ष तुलना गर्दा, राउन्डिङ त्रुटिको प्रभावले अपेक्षित परिणाम नआउन सक्छ, त्यसैले प्रत्यक्ष तुलना टाल्नुपर्छ। उदाहरणका लागि, 0.1 + 0.2 लाई 0.3 सँग तुलना गर्दा, त्रुटिको कारणले “बराबर छैन” भन्ने निर्णय हुन सक्छ। यस्तो अवस्थामा, इप्सिलन (epsilon) भनिने सानो मान प्रयोग गरेर तुलना गर्नु प्रभावकारी हुन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double d = 0.1;
    double e = 0.2;
    double f = d + e;
    double epsilon = 1e-9;

    if (fabs(f - 0.3) < epsilon) {
        printf("f 0.3 को धेरै नजिक छn");
    } else {
        printf("f 0.3 होइनn");
    }
    return 0;
}

यस उदाहरणमा, fabs(f - 0.3) < epsilon शर्त प्रयोग गरेर, f यदि 0.3 को धेरै नजिक छ भने “बराबर” भनेर निर्णय गरिन्छ। यसले त्रुटिको प्रभावलाई न्यूनतम राखी, सटीक तुलना सम्भव बनाउँछ।

4.4 दोहोर्याइने गणनामा त्रुटिको संचय

फ्लोटिङ पोइन्ट संख्याहरूलाई दोहोर्याइने लूप गणनामा प्रयोग गर्दा, राउन्डिङ त्रुटि संचय हुन्छ र गणनाको परिणाममा ठूलो प्रभाव पार्न सक्छ। उदाहरणका लागि, धेरै पटक जोड वा घटाउ गर्ने प्रक्रियामा त्रुटि सजिलै संचय हुन्छ। यदि शुद्धता आवश्यक छ भने, डेटा प्रकार चयन वा गणना विधि सुधार गरेर त्रुटि घटाउन सकिन्छ।

5. C भाषा को मानक पुस्तकालय प्रयोग गरेर गणना गर्ने तरिका

C भाषामा, फ्लोटिंग पोइन्ट गणनालाई समर्थन गर्ने धेरै फङ्सनहरू मानक पुस्तकालयमा उपलब्ध छन्। विशेष गरी math.h पुस्तकालयले जटिल संख्यात्मक गणनालाई सरल र प्रभावकारी रूपमा गर्न सक्ने, कार्यक्रमको विश्वसनीयता र पठनीयता सुधार्ने महत्वपूर्ण उपकरण हो। यस खण्डमा, math.h मा समावेश प्रमुख फङ्सनहरू र तिनको प्रयोग उदाहरणहरू व्याख्या गरिन्छ।

5.1 वर्गमूल निकाल्ने: sqrt फङ्सन

sqrt फङ्सन संख्याको वर्गमूल गणना गर्न प्रयोग गरिन्छ। वर्गमूल भौतिक गणना, ग्राफिक प्रोसेसिङ आदि क्षेत्रहरूमा बारम्बार प्रयोग गरिन्छ, र सजिलै सटीक नतिजा प्राप्त गर्न सकिन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double value = 16.0;
    double result = sqrt(value);
    printf("वर्गमूल: %fn", result);  // आउटपुट: वर्गमूल: 4.000000
    return 0;
}

5.2 घात निकाल्ने: pow फङ्सन

pow फङ्सन आधार र घातांकलाई आर्गुमेन्टको रूपमा निर्दिष्ट गरेर घात गणना गर्दछ। घात गणना भौतिक गणना र एल्गोरिदमको कार्यान्वयनमा धेरै प्रयोग हुन्छ, र गणना दक्षता सुधारमा योगदान पुर्याउँछ।

#include <stdio.h>
#include <math.h>

int main() {
    double base = 3.0;
    double exponent = 4.0;
    double result = pow(base, exponent);
    printf("घात: %fn", result);  // आउटपुट: घात: 81.000000
    return 0;
}

5.3 शेष निकाल्ने: fmod फङ्सन

fmod फङ्सन फ्लोटिंग पोइन्ट संख्याहरूको शेष गणना गर्न प्रयोग गरिन्छ। पूर्णांकमा सीमित नभएको शेष गणना चक्रीय प्रक्रिया वा निर्देशांक गणनामा प्रयोग गरिन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double numerator = 5.5;
    double denominator = 2.0;
    double result = fmod(numerator, denominator);
    printf("शेष: %fn", result);  // आउटपुट: शेष: 1.500000
    return 0;
}

5.4 निरपेक्ष मान निकाल्ने: fabs फङ्सन

fabs फङ्सन फ्लोटिंग पोइन्ट संख्याको निरपेक्ष मान गणना गर्न प्रयोग गरिन्छ। विशेष गरी, त्रुटि विचार गरी तुलना गर्ने वा संख्याको चिन्ह महत्त्वपूर्ण नहुनु पर्ने परिस्थितिहरूमा यो धेरै प्रयोग हुन्छ।

#include <stdio.h>
#include <math.h>

int main() {
    double value = -5.75;
    double result = fabs(value);
    printf("परम मान: %fn", result);  // आउटपुट: परम मान: 5.750000
    return 0;
}

6. अनुप्रयोग उदाहरण: दशमलव बिन्दु पछिको अंकहरूलाई मिलाइएको आउटपुट ढाँचा

C भाषाकोprintf कार्यले, दशमलव बिन्दु पछिको अंकहरू मात्र होइन, सम्पूर्ण चौडाइ र 0‑भर्ने निर्दिष्ट गरेर, डेटा देख्न सजिलो बनाइ ठूलो सुधार गर्न सक्छ। विशेष गरी, तालिका स्वरूपमा डेटा प्रदर्शन वा दृश्यात्मक सरेखिकरण आवश्यक परेमा, फर्म्याट निर्दिष्टकर्ता प्रयोग गर्नु उपयोगी हुन्छ। यस भागमा, आउटपुटलाई सरेखित गर्नका लागि विशिष्ट प्रविधिहरू व्याख्या गरिन्छ।

6.1 मूलभूत 0‑भर्ने निर्दिष्ट

0‑भर्ने भनेको संख्याको अगाडि शून्य थपेर सम्पूर्ण अंकसंख्या मिलाउने विधि हो। उदाहरणका लागि, %07.3f जस्तै निर्दिष्ट गर्दा, संख्या दशमलव बिन्दु पछिको 3 अंकसम्म देखाइन्छ, र सम्पूर्ण चौडाइ 7 अंकमा एकरूप हुने सम्म अगाडि शून्य थपिन्छ।

#include <stdio.h>

int main() {
    float number1 = 1.23;
    float number2 = 123.456;
    printf("शून्य भर्ने निर्दिष्टीकरण (चौडाइ ७・दशमलव ३ अंक): %07.3fn", number1);
    printf("शून्य भर्ने निर्दिष्टीकरण (चौडाइ ७・दशमलव ३ अंक): %07.3fn", number2);
    return 0;
}

आउटपुट परिणाम तलको जस्तै छ।

शून्य भरेको निर्दिष्टीकरण (चौडाइ ७・दशमलवको ३ अंक): 001.230
शून्य भरेको निर्दिष्टीकरण (चौडाइ ७・दशमलवको ३ अंक): 123.456

6.2 दायाँ सरेखिकरण・बायाँ सरेखिकरण निर्दिष्ट

printf कार्यको फर्म्याट निर्दिष्टकर्ताले, संख्यालाई दायाँ सरेखिकरण वा बायाँ सरेखिकरण गर्न सकिन्छ। दायाँ सरेखिकरणले संख्यालाई डिफल्ट स्थितिमा राख्छ, तर बायाँ सरेखिकरण गर्न, फर्म्याट निर्दिष्टकर्ताको अगाडि - थपेर सम्भव हुन्छ।

#include <stdio.h>

int main() {
    float number1 = 3.14159;
    float number2 = 2.71828;
    printf("दाहिने संरेखण निर्दिष्ट: %10.3fn", number1);  // समग्र चौडाइ 10 अंकमा दाहिने संरेखण
    printf("बायाँ संरेखण निर्दिष्ट: %-10.3fn", number2); // समग्र चौडाइ 10 अंकमा बायाँ संरेखण
    return 0;
}

आउटपुट परिणाम:

दाहिने संरेखण निर्दिष्ट:      3.142
बायाँ संरेखण निर्दिष्ट: 2.718

6.3 पूर्णांक भाग र दशमलव बिन्दु पछिको अंकसंख्या अनुकूलन

पूर्णांक भागको चौडाइ र दशमलव बिन्दु पछिको अंकसंख्यालाई अलग‑अलग निर्दिष्ट गर्न पनि सम्भव छ। उदाहरणका लागि, %5.2f जस्तै निर्दिष्ट गर्दा, पूर्णांक भागलाई 5 अंकको चौडाइ लिई, दशमलव बिन्दु पछिको 2 अंकमा देखाउन सकिन्छ।

#include <stdio.h>

int main() {
    float number1 = 123.456;
    float number2 = 78.9;
    printf("अनुकूलित प्रदर्शन (चौडाइ 5, दशमलव 2 अंक): %5.2fn", number1);
    printf("अनुकूलित प्रदर्शन (चौडाइ 5, दशमलव 2 अंक): %5.2fn", number2);
    return 0;
}

आउटपुट परिणाम:

कस्टम प्रदर्शन (चौडाइ 5・दशमलव 2 स्थान): 123.46
कस्टम प्रदर्शन (चौडाइ 5・दशमलव 2 स्थान):  78.90

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

7. सारांश र ध्यान दिनुपर्ने बुँदाहरू

यस लेखमा, C भाषा प्रयोग गरेर फ्लोटिङ पोइन्ट संख्याहरूलाई ह्यान्डल गर्ने आधारभूतदेखि उन्नत प्रविधिहरू सम्म, महत्वपूर्ण बुँदाहरूलाई प्रणालीगत रूपमा व्याख्या गरिएको छ। दशमलव बिन्दु पछिको अंक संख्या निर्दिष्ट गरेर आउटपुट गर्ने तरिका, गणना गर्दा शुद्धताको ह्यान्डलिङ, साथै math.h लाइब्रेरी प्रयोग गरेर संख्यात्मक गणनाको दक्षता बढाउने बारे पनि उल्लेख गरिएको छ, र व्यावहारिक प्रोग्राम डिजाइनमा उपयोगी ज्ञान प्रदान गरिएको छ। तल, प्रत्येक खण्डको मुख्य बुँदाहरू र फ्लोटिङ पोइन्ट संख्याहरूलाई ह्यान्डल गर्दा ध्यान दिनुपर्ने महत्वपूर्ण बुँदाहरू संक्षेपमा प्रस्तुत गरिएको छ।

7.1 मुख्य बुँदाहरूको सारांश

  • फ्लोटिङ पोइन्ट प्रकारको चयन
    C भाषामा float, double, long double का तीनवटा फ्लोटिङ पोइन्ट प्रकारहरू छन्, र प्रयोगको उद्देश्य तथा आवश्यक शुद्धताका आधारमा तिनीहरूलाई विभाजन गरेर प्रयोग गर्नु महत्त्वपूर्ण छ।float प्रकार कम शुद्धता आवश्यक परे प्रयोग गर्न उपयुक्त छ, double सामान्य संख्यात्मक गणनाका लागि, र long double उच्च शुद्धता आवश्यक परे उपयुक्त हुन्छ।
  • दशमलव बिन्दु पछिको अंक संख्या निर्दिष्ट गर्नु
    printf फङ्क्शनमा %.nf, %.ne, %.ng जस्ता स्वरूपहरू प्रयोग गरेर, दशमलव बिन्दु पछिको अंक संख्या तथा प्रदर्शन ढाँचा निर्दिष्ट गर्न सकिन्छ। यो डेटा देख्न सजिलो बनाउने र शुद्धता बढाउने प्रभावकारी उपाय हो।
  • शुद्धता र त्रुटिको नियन्त्रण
    राउन्डिङ त्रुटि र शुद्धताको सीमाबद्धताबारे बुझ्न आवश्यक छ। विशेष गरी, संख्यात्मक तुलना गर्दा इप्सिलन (epsilon) प्रयोग गरेर, गणनात्मक त्रुटिलाई विचार गरी सुरक्षित तुलना सम्भव हुन्छ।
  • मानक लाइब्रेरीको उपयोग
    math.h मा समावेश गरिएको sqrt, pow, fmod, fabs जस्ता फङ्क्शनहरू प्रयोग गरेर, जटिल संख्यात्मक गणनालाई सरल रूपमा कार्यान्वयन गर्न सकिन्छ, र उच्च विश्वसनीयता भएको प्रोग्राम निर्माण गर्न सकिन्छ।
  • फरम्याटको प्रयोग
    दशमलव बिन्दु पछिको अंक संख्या तथा सम्पूर्ण चौडाइ निर्दिष्ट गरेर, शून्य भर्नु, दायाँ सरेको, बायाँ सरेको जस्ता विकल्पहरू प्रयोग गरेर, डेटा को दृश्यात्मक सन्तुलन सम्भव हुन्छ। यसले तालिका स्वरूपको डेटा सजिलै व्यवस्थित गर्न र पाठकको बुझाइलाई गहिरो बनाउँछ।

7.2 ध्यान दिनुपर्ने बुँदाहरू र उत्तम अभ्यासहरू

  • फ्लोटिङ पोइन्ट संख्याको प्रत्यक्ष तुलना नगर्नु
    फ्लोटिङ पोइन्ट संख्याहरूको प्रत्यक्ष तुलना राउन्डिङ त्रुटिको प्रभावलाई सहजै ग्रहण गर्छ, र अपेक्षित नतिजा नआउने सम्भावना धेरै हुन्छ, त्यसैले प्रत्यक्ष तुलना नगर्नु उचित छ। तुलना गर्दा इप्सिलन प्रयोग गर्ने विधि सिफारिस गरिन्छ।
  • पुनरावृत्ति गणनाबाट त्रुटि संचयमा ध्यान दिनु
    फ्लोटिङ पोइन्ट संख्यालाई बारम्बार प्रयोग गर्ने लूप गणनामा त्रुटि सजिलै संचय हुन्छ, र नतिजा धेरै विचलित हुन सक्छ। शुद्धता आवश्यक पर्ने गणनामा, उच्च शुद्धताको डेटा प्रकार वा त्रुटि घटाउने गणना विधिको प्रयोग आवश्यक हुन्छ।
  • उचित फरम्याट निर्दिष्ट गरेर दृश्यता सुनिश्चित गर्नु
    डेटाको सन्तुलन र आउटपुट फरम्याटलाई उचित रूपमा निर्दिष्ट गरेर, आउटपुट नतिजा सजिलै देख्न सकिन्छ। विशेष गरी तालिका स्वरूपको आउटपुटमा, शून्य भर्नु वा चौडाइ निर्दिष्ट गरेर डेटा व्यवस्थित हुन्छ, र पाठकको बुझाइ गहिरो हुन्छ।
侍エンジニア塾