2016-08-25 12 views
8

में समारोह मैं थोड़ा सी में round() समारोहका उपयोग दौर() ग

सबसे पहले लेकर संदेह में हूँ, आदमी कहते हैं:

SYNOPSIS 
    #include <math.h> 
    double round(double x); 

RETURN VALUE 
    These functions return the rounded integer value. 
    If x is integral, +0, -0, NaN, or infinite, x itself is returned. 

वापसी मान एक double/float या है एक int?

दूसरे स्थान पर, मैंने एक ऐसा फ़ंक्शन बनाया है जो पहले राउंड करता है, फिर int में रहता है। मेरे कोड मैं लिए एक मतलब के रूप में उपयोग पर लैटर युगल

int tointn(double in,int n) 
{ 
    int i = 0; 
    i = (int)round(in*pow(10,n)); 
    return i; 
} 

इस समारोह की तुलना जाहिरा तौर पर मेरे परीक्षण के दौरान स्थिर नहीं है। क्या यहां अनावश्यकता है? खैर ... मैं केवल एक जवाब के लिए नहीं देख रहा हूं, लेकिन इस विषय पर एक बेहतर समझ है।

+0

वापसी मान हमेशा एक 'double' या एक' float' है:

यहाँ आदमी पेज से एक अंश जो तरीके के बारे में राउंडिंग किया जाएगा है। यदि आपके द्वारा इनपुट की गई संख्या '42.000' की तरह कुछ है तो इसे अभिन्न माना जाता है, भले ही आप 'डबल' या 'फ्लोट' पास करते हैं। "स्थिर नहीं है" से आपका क्या मतलब है? यदि आप 'डबल' की तुलना कर रहे हैं तो आपको फ्लोटिंग पॉइंट मानों के लिए मशीन ईपीएसलॉन पर भी ध्यान देना चाहिए। – meetaig

+0

आप उस आदमी के पहले भाग से देख सकते हैं जिसे आप पोस्ट करते हैं कि 'राउंड()' फ़ंक्शन 'डबल' देता है। – Toby

+0

जब आप बड़े होते हैं तो आप 'पाउ (10, एन)' की सटीकता पर भरोसा नहीं कर सकते हैं। आपके परीक्षणों में 'n' का सामान्य/अधिकतम मूल्य क्या है? –

उत्तर

5

मैन-पेज में शब्द का अर्थ शाब्दिक रूप से पढ़ना है, जो कि इसके गणितीय अर्थ में है। शब्द "एक्स अभिन्न" का अर्थ है कि xZ का एक तत्व है, x में डेटा प्रकार int है।

कास्टिंग एक doubleint लिए खतरनाक हो सकता है क्योंकि अधिकतम मनमाना अभिन्न मूल्य एक double धारण कर सकते हैं 2^52, अधिकतम मूल्य एक int धारण कर सकते हैं छोटे हो सकता है (आईईईई 754 अनुरूप binary64 कल्पना करते हुए) है (यह ज्यादातर 32 है 32-बिट आर्किटेक्चर पर बिट और कुछ 64-बिट आर्किटेक्चर पर 32-बिट)।

आप दस में से केवल शक्तियों की जरूरत है कि आप इस छोटे कार्यक्रम खुद के साथ यह परीक्षण कर सकते हैं:

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

int main(){ 
    int i; 
    for(i = 0;i < 26;i++){ 
    printf("%d:\t%.2f\t%d\n",i, pow(10,i), (int)pow(10,i)); 
    } 
    exit(EXIT_SUCCESS); 
} 
इसके बजाय कास्टिंग आप कार्यों कि e.g तरह .: lround(3) एक उचित अभिन्न डेटा प्रकार वापसी का उपयोग करना चाहिए की

+0

धन्यवाद, मुझे आसपास के बारे में पता नहीं था()। मैं कोशिश करुंगा। – Mattana

3

यहां मैन पेज से एक अंश है।

#include <math.h> 

    double round(double x); 
    float roundf(float x); 
    long double roundl(long double x); 

नोटिस: लौटाया मूल्य कभी पूर्णांक नहीं होता है। हालांकि, लौटाए गए मान का आंशिक भाग 0

नोटिस पर सेट किया गया है: सटीक फ़ंक्शन के आधार पर लौटाए गए मूल्य का प्रकार निर्धारित करेगा।

These functions round x to the nearest integer, but round halfway cases 
    away from zero (regardless of the current rounding direction, see 
    fenv(3)), instead of to the nearest even integer like rint(3). 

    For example, round(0.5) is 1.0, and round(-0.5) is -1.0. 
+0

"हालांकि, लौटाए गए मान का आंशिक भाग 0 पर सेट है।" किस परिशुद्धता में यह सच है? – Mattana

+0

अच्छा है कि आपने "आधा रास्ते" का उल्लेख किया है। इस तथ्य के बारे में क्या है कि 0.5 0.5000001 या 0.4 99 99 998 उदाहरण के लिए हो सकता है? इसके साथ 'राउंड()' सौदा कैसे करता है? – Mattana

+0

@ मट्टाना, मूल्य को प्रदर्शित करने में उपयोग की जाने वाली 'परिशुद्धता' के बावजूद दशमलव के दाईं ओर सभी विवरण/सभी भाग प्राप्त करने के लिए 'राउंड()' के लिए मैन पेज को पढ़ने का दृढ़ता से सुझाव देते हैं। यह उन चीजों में से एक है जो 'राउंड() 'करता है। 5 से कम वाले मान को 'मंजिल()' फ़ंक्शन की तरह 0 की ओर गोल किया जाएगा। 5 से अधिक के साथ एक मूल्य अनंतता की तरफ गोल किया जाएगा, जैसे 'छत()' फ़ंक्शन। कुल संख्या नकारात्मक होने पर मामलों पर मामूली अंतर ध्यान दें – user3629249

संबंधित मुद्दे