2013-02-25 17 views
8

Chcę ekstremalnej wartości -ve.Czy można bezpiecznie używać -DBL_MAX w kodzie?

#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; 



} 

Czy można bezpiecznie używać kodu -DBL_MAX? Jeśli ktoś zna lepsze podejście, prosimy o podzielenie się tutaj.

+3

Dlaczego nie "DBL_MIN"? – Maroun

+11

@MarounMaroun '-DBL_MAX! = DBL_MIN' –

+2

Polecam używanie [' std :: numeric_limits'] (http://en.cppreference.com/w/cpp/types/numeric_limits) zamiast starych makr C. –

Odpowiedz

8

DBL_MAX jest częścią standardowej biblioteki. Jako taki nie jest szczególnie niebezpieczny.

Porównanie nie-integralnych wartości zmiennoprzecinkowych dla równości jest z natury niebezpieczne, w sensie niewiarygodności.

To dlatego, że arytmetyka zmiennoprzecinkowa może być wykonywana z większą precyzją niż wybrany typ, z wynikami konwertowanymi do iz powrotem, i nie zawsze, jak myślisz.


mimochodem zdefiniowania takiego makro:

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

& hellip; jest niebezpieczny: możesz łatwo stać się ofiarą niepożądanego zamiany tekstu, a poza tym jest to obrzydliwe.

Zamiast używać funkcji inline, nawet jeśli inline nie gwarantuje optymalizację:

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

a następnie to samo dotyczy stałej THRESHOLD, powinien on być po prostu stała w C++:

double const threshold = 2*DBL_MIN; 
Powiązane problemy