सभी शीर्षक में हैं। दो फ़ंक्शन एक्सप() और लॉग() का उपयोग करते समय संभावित ओवरफ़्लो कैसे जांचें?सामान्य गणित फ़ंक्शन एक्स() लॉग() का उपयोग करते समय अतिप्रवाह को कैसे रोकें?
उत्तर
@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;
}
#include <errno.h>
जब एक oferflow होता है, तो errnoERANGE को तैयार है।
अगली बार, मांगने से पहले अपना होमवर्क करना।
Googling: "C++ exp" पहले परिणाम के रूप में इस लौटे http://www.cplusplus.com/reference/cmath/exp/
पृष्ठ के बीच में, वहाँ आप के लिए क्या चाहिए, तो है।
उद्देश्य से पहले यह होता है अतिप्रवाह के लिए जाँच करने के लिए है। अन्यथा, अपरिभाषित व्यवहार उत्पन्न किया जाएगा। – WildThing
यह आपके विचार से आसान है। बस कोशिश करें और अगर त्रुटि को ERANGE पर सेट किया गया है तो अलग-अलग मानों के साथ पुनः प्रयास करें। यह दृष्टिकोण * सरल *, * सस्ता * और अभी तक * प्रभावी * है। –
यह अतिप्रवाह के लिए एक पोस्ट-टेस्ट है जो मेरी समस्या के लिए लागू नहीं है क्योंकि इनपुट हर बार भिन्न होता है। मैं – WildThing
पहले से ओवरफ्लो की जांच करने का सबसे अच्छा तरीका केस-दर-मामले आधार पर समझदारी से करना है।
लघुगणक और घातांक के अपने ज्ञान का उपयोग करके, आप 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 जांच करते हैं।
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 शून्य से बड़ा है।
आपको अपनी सबसे बड़ी फ्लोट कहां से मिली? यह मंच निर्भर है, और किसी भी मंच के लिए इसे प्राप्त करने के साधन हैं। – juanchopanza
फिर गणना से पहले ओवरफ़्लो के खिलाफ जांच करने से पहले उसे अपने प्लेटफ़ॉर्म की सीमा को रोकना चाहिए। –
आपको सुझाव देना चाहिए कि कुछ अजीब संख्या उद्धृत करने के बजाय आपके जवाब में और दावा करना सबसे बड़ा फ्लोट है :) – juanchopanza
रोकें तुलना में बेहतर है, तो आप अपवाद पकड़ कर सकते हैं:
try {
z=exp(n);
} catch (...) {
puts("Can't calcute exp...");
}
... सी ++ में। सी में कोई अपवाद नहीं है। – urzeit
'exp' ** ** ** अतिप्रवाह पर अपवाद फेंकता है। एक ** फ़्लोटिंग-पॉइंट अपवाद ** है, लेकिन यह फ़्लोटिंग-पॉइंट के लिए विशिष्ट "अपवाद" का एक अलग अर्थ है। इसका सी ++ अपवादों से कोई लेना देना नहीं है –
- 1. CString :: प्रारूप का उपयोग करते समय C6284 को कैसे रोकें?
- 2. jQuery संवाद का उपयोग करते समय स्क्रिप्ट को कैसे रोकें?
- 3. प्रतिनिधि का उपयोग करते समय ईवेंट प्रचार को कैसे रोकें?
- 4. varargin (...) का उपयोग करते समय विभिन्न फ़ंक्शन उपयोग कैसे दिखाएं?
- 5. सामान्य आउटपुट को कंसोल पर प्रिंट करते समय समय-समय पर "लॉग फ़ाइल" में टेक्स्ट कैसे भेजें?
- 6. exmpp फ़ंक्शन का उपयोग करते समय फ़ंक्शन क्लॉज त्रुटि
- 7. गणित फ़ंक्शन
- 8. विंडो को विभाजित करते समय विम स्क्रॉलिंग को कैसे रोकें?
- 9. फ़ंक्शन को कॉल करते समय डिफ़ॉल्ट मान का उपयोग
- 10. IE11 में सूचक घटनाओं का उपयोग करते समय क्लिक रोकें?
- 11. phpStorm को अपेक्षित दिखने से कैसे रोकें ... PHPUnit mocks का उपयोग करते समय चेतावनी?
- 12. पाइथन लॉगिंग मॉड्यूल का उपयोग करते समय डुप्लिकेट लॉग आउटपुट
- 13. ईओएफ को पूरा करते समय फ़ाइल पढ़ने को कैसे रोकें?
- 14. निर्देशों का उपयोग करते समय रीशेर्पर को नेमस्पेस को छोटा करने से कैसे रोकें?
- 15. 'हटाएं() `का उपयोग करते समय django को स्मृति में वस्तुओं को लोड करने से कैसे रोकें?
- 16. सिस्टम() या passthru() का उपयोग कर टर्मिनल कमांड को लागू करते समय PHP को कैसे रोकें?
- 17. जीडीबी का प्रयोग प्रोग्राम को रोकें जब यह फ़ाइल एक्स
- 18. रीफ्रेश करते समय डुप्लिकेट प्रविष्टियों को कैसे रोकें?
- 19. अमेज़ॅन को स्क्रैप करते समय ब्लैकलिस्टेड होने से कैसे रोकें
- 20. पायथन: फ़ंक्शन को कैसे रोकें?
- 21. एंकर लिंक पर क्लिक करते समय कूद को कैसे रोकें?
- 22. CGLIB/स्प्रिंग एओपी का उपयोग करते समय झूठी सकारात्मक नल सूचक चेतावनी को कैसे रोकें?
- 23. आईएनटी कॉलम पर एसयूएम का उपयोग करते समय अंकगणित ओवरफ्लो त्रुटि को कैसे रोकें?
- 24. क्यों वेबपी का उपयोग करते समय चीनी खराब हो गए लेकिन MySQLdb का उपयोग करते समय यह सामान्य है?
- 25. इसे दर्ज करते समय स्क्रॉलिंग से UITextView को कैसे रोकें
- 26. बाईं ओर स्क्रॉल करते समय झपकी को कैसे रोकें?
- 27. पैरामीटर को परिभाषित करते समय गणित एक अंडरस्कोर का उपयोग क्यों करता है?
- 28. PHP मेल फ़ंक्शन का उपयोग करते समय कोई सीमा है?
- 29. सत्र समय समाप्ति को कैसे रोकें
- 30. फ़ंक्शन के अंदर dplyr का उपयोग करते समय त्रुटि
मुझे लगता है कि आप गलत हैं, एक अनुरूप प्रोग्राम बनाने के लिए आपको अतिप्रवाह उत्पन्न करने से पहले अतिप्रवाह के लिए परीक्षण करने की आवश्यकता है। इस http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-cc – WildThing
@ user2114690 अच्छा लिंक देखें, धन्यवाद –
@ जेम्स कानज़ ने जो कहा, उसे जोड़ा गया, मुझे लगता है कि मैं गलत थे। आपका समाधान सही है। धन्यवाद – WildThing