2013-02-25 8 views
8

Ich möchte extreme -ve Wert.Ist die Verwendung von -DBL_MAX im Code sicher?

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



} 

So ist es sicher -DBL_MAX in Code zu benutzen? Wenn jemand besser Ansatz weiß, bitte hier teilen.

+3

Warum nicht 'DBL_MIN'? – Maroun

+11

@MarounMaroun '-DBL_MAX! = DBL_MIN' –

+2

Ich empfehle die Verwendung von [' std :: numeric_limits'] (http://en.cppreference.com/w/cpp/types/numeric_limits) anstelle der alten C-Makros. –

Antwort

8

DBL_MAX ist Teil der Standardbibliothek. Als solches ist es nicht besonders unsicher.

Vergleichen von nicht-integralen Fließkommawerten für die Gleichheit ist jedoch inhärent unsicher im Sinne von unzuverlässig.

Das liegt daran, dass Fließkomma-Arithmetik mit höherer Genauigkeit als der von Ihnen gewählte Typ ausgeführt werden kann, wobei die Ergebnisse hin und her konvertiert werden und nicht immer so, wie Sie es sich denken.


im Vorbeigehen, die einen Makro wie:

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

& hellip; ist unsicher: Sie können leicht Opfer unerwünschter Textsubstitution werden und außerdem ist es ein Schandfleck.

Statt eine inline Funktion auch verwenden, wenn inline Optimierung ist keine Garantie:

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

und dann das gleiche gilt für die konstante THRESHOLD, es ist einfach eine Konstante in C++ sein sollte:

double const threshold = 2*DBL_MIN; 
Verwandte Themen