2013-02-25 14 views
8

मुझे चरम-मूल्य चाहिए।क्या कोड में डीबीएल_एमएक्स का उपयोग करना सुरक्षित है?

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

#define THRESHOLD 2*DBL_MIN 

#define FEQ(x, y) (fabs((x) - (y)) < THRESHOLD) 

int main() 
{ 
double a = -DBL_MAX; // I want here minimum value of double 
if(FEQ(a,-DBL_MAX)) 
cout<<"Equal " <<endl; 
else 
cout<<"NOt equal"<<endl; 
return 0; 



} 

तो, क्या कोड में -DBL_MAX का उपयोग करना सुरक्षित है? अगर कोई बेहतर दृष्टिकोण जानता है तो कृपया यहां साझा करें।

+3

'डीबीएल_MIN' क्यों नहीं? – Maroun

+11

@MarounMaroun '-DBL_MAX! = DBL_MIN' –

+2

मैं पुराने सी मैक्रोज़ के बजाय [' std :: numeric_limits'] (http://en.cppreference.com/w/cpp/types/numeric_limits) का उपयोग करने की अनुशंसा करता हूं। –

उत्तर

8

DBL_MAX मानक पुस्तकालय का हिस्सा है। जैसे कि यह विशेष रूप से असुरक्षित नहीं है।

हालांकि, असमानता के लिए गैर-अभिन्न फ्लोटिंग पॉइंट मानों की तुलना करना अविश्वसनीय रूप से असुरक्षित है।

ऐसा इसलिए है क्योंकि फ़्लोटिंग पॉइंट अंकगणित आपके चुने हुए प्रकार की तुलना में उच्च परिशुद्धता के साथ किया जा सकता है, जिसके परिणामस्वरूप आगे और आगे परिवर्तित होते हैं, और जैसा कि आप सोचते हैं।


गुजर में

, जैसे किसी मैक्रो को परिभाषित:

#define FEQ(x, y) (fabs((x) - (y)) < THRESHOLD) 

है & hellip; असुरक्षित है: आप आसानी से अवांछित पाठ प्रतिस्थापन का शिकार हो सकते हैं और इसके अलावा यह एक नजरअंदाज है। C++ एक निरंतर

inline bool feq(double const x, double const y) { return fabs(x - y) < THRESHOLD; } 

और फिर उसी निरंतर THRESHOLD के लिए चला जाता है, यह बस होना चाहिए::

इसके बजाय, एक inline फ़ंक्शन का उपयोग करें, भले ही inline अनुकूलन की गारंटी नहीं देता

double const threshold = 2*DBL_MIN; 
संबंधित मुद्दे