2013-07-11 5 views

उत्तर

7

@TheOtherGuy के उत्तर का विस्तार करने के लिए, यदि ओवरफ़्लो होता है तो आप ऑपरेशन रद्द कर सकते हैं।

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

int main(void) 
{ 
    double param, result; 

    errno = 0; 
    param = 1e3; 
    result = exp (param); 
    if (errno == ERANGE) { 
     printf("exp(%f) overflows\n", param); 
     result = param; 
    } 
    printf ("The exponential value of %f is %f.\n", param, result); 
    return 0; 
} 
+1

मुझे लगता है कि आप गलत हैं, एक अनुरूप प्रोग्राम बनाने के लिए आपको अतिप्रवाह उत्पन्न करने से पहले अतिप्रवाह के लिए परीक्षण करने की आवश्यकता है। इस http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – WildThing

+0

@ user2114690 अच्छा लिंक देखें, धन्यवाद –

+1

@ जेम्स कानज़ ने जो कहा, उसे जोड़ा गया, मुझे लगता है कि मैं गलत थे। आपका समाधान सही है। धन्यवाद – WildThing

12
#include <errno.h> 

जब एक oferflow होता है, तो errnoERANGE को तैयार है।


अगली बार, मांगने से पहले अपना होमवर्क करना।

Googling: "C++ exp" पहले परिणाम के रूप में इस लौटे http://www.cplusplus.com/reference/cmath/exp/
पृष्ठ के बीच में, वहाँ आप के लिए क्या चाहिए, तो है।

+0

उद्देश्य से पहले यह होता है अतिप्रवाह के लिए जाँच करने के लिए है। अन्यथा, अपरिभाषित व्यवहार उत्पन्न किया जाएगा। – WildThing

+2

यह आपके विचार से आसान है। बस कोशिश करें और अगर त्रुटि को ERANGE पर सेट किया गया है तो अलग-अलग मानों के साथ पुनः प्रयास करें। यह दृष्टिकोण * सरल *, * सस्ता * और अभी तक * प्रभावी * है। –

+0

यह अतिप्रवाह के लिए एक पोस्ट-टेस्ट है जो मेरी समस्या के लिए लागू नहीं है क्योंकि इनपुट हर बार भिन्न होता है। मैं – WildThing

1

पहले से ओवरफ्लो की जांच करने का सबसे अच्छा तरीका केस-दर-मामले आधार पर समझदारी से करना है।

लघुगणक और घातांक के अपने ज्ञान का उपयोग करके, आप INT_MAX की तरह गुणों का उपयोग करके संभावित अतिप्रवाह पहचान करने के लिए सक्षम होना चाहिए: इन C++ Limitations

की जांच मैं एक साथ एक मोटा नमूना C++ निष्पादन फेंक दिया, यह सोचते हैं आप पहले से पता है कि सीमित करता है आप प्रयास कर रहे हैं पीछा करना।

#include <iostream> 

// nTh root calculator 
bool is_exp_overflow(int input_val, int exponent) 
{ 
    my_max = pow(INT_MAX, (1/exponent); 
    if (input_val > my_max) 
    { 
     return true; 
    } 
    else 
     return false; 
} 

void runExp(int my_input, int my_exp) 
{ 
    // Do maths 
} 

int main() 
{ 
    int my_input = 0; 
    int my_exp = 0; 
    std::cout << "Enter test value\n"; 
    std::cin >> my_input; 
    std::cout << "Enter test exponent\n"; 
    std::cin >> my_exp; 
    bool exp_unsafe = 1; 
    exp_unsafe = is_exp_overflow(my_input, my_exp); 

    if (!exp_unsafe) 
     runExp(my_input, my_exp); 
    else 
     std::cout << "Code is unsafe\n"; 

    return 0; 
} 

आप त्रुटियों पोस्टमार्टम को पकड़ने के लिए देख रहे हैं, errno in range जांच करते हैं।

2

exp() से निपटने के लिए:

बस एक चर जो आप लॉग इन करने के आवंटित (FLT_MAX) के खिलाफ की तुलना करें। FLT_MAX सबसे बड़ी फ्लोट है। आप से पहले एक एक्स() की गणना कर सकते हैं। क्योंकि लॉग()एक्सप() के विपरीत है।

#include <iostream> 
#include <math.h> 
using namespace std; 

int main() 
{ 
    float a=1E+37f; // an example of maximum finite representable floating-point number. 
    //max value can change with platform so, 
    //either use definitions or use a function you wrote 
    // a= getMaxFloat(); or a=FLT_MAX 
    float b=log(a); // limit of float to give in exp(); 
    float c=3242325445.0f; // test variable 
    cout << "Hello world!" << endl; 
    if(c>b){cout<<"you should not take exp of "<<c<<endl;}else{cout<<"go on"<<endl;} 

    return 0; 
} 

लॉग() से निपटने के लिए:

1) आप एक्स बह निकला से पहले लॉग (एक्स) everflow नहीं कर सकते। (ऊपरी बाउंड के लिए)

2) फ्लोट/डबल (x) परिशुद्धता लॉग (x) के लिए नकारात्मक-अनंतता के अतिप्रवाह के लिए पर्याप्त नहीं है।

3) सुनिश्चित करें कि x शून्य से बड़ा है।

+1

आपको अपनी सबसे बड़ी फ्लोट कहां से मिली? यह मंच निर्भर है, और किसी भी मंच के लिए इसे प्राप्त करने के साधन हैं। – juanchopanza

+0

फिर गणना से पहले ओवरफ़्लो के खिलाफ जांच करने से पहले उसे अपने प्लेटफ़ॉर्म की सीमा को रोकना चाहिए। –

+0

आपको सुझाव देना चाहिए कि कुछ अजीब संख्या उद्धृत करने के बजाय आपके जवाब में और दावा करना सबसे बड़ा फ्लोट है :) – juanchopanza

1

रोकें तुलना में बेहतर है, तो आप अपवाद पकड़ कर सकते हैं:

try { 
    z=exp(n); 
} catch (...) { 
    puts("Can't calcute exp..."); 
} 
+0

... सी ++ में। सी में कोई अपवाद नहीं है। – urzeit

+2

'exp' ** ** ** अतिप्रवाह पर अपवाद फेंकता है। एक ** फ़्लोटिंग-पॉइंट अपवाद ** है, लेकिन यह फ़्लोटिंग-पॉइंट के लिए विशिष्ट "अपवाद" का एक अलग अर्थ है। इसका सी ++ अपवादों से कोई लेना देना नहीं है –

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