2013-02-25 19 views
8

我想要极端的价值。在代码中使用-DBL_MAX是否安全?

#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

为什么不'DBL_MIN'? – Maroun 2013-02-25 10:08:22

+11

@MarounMaroun'-DBL_MAX!= DBL_MIN' – 2013-02-25 10:09:39

+2

我推荐使用['std :: numeric_limits'](http://en.cppreference.com/w/cpp/types/numeric_limits)而不是旧的C宏。 – 2013-02-25 10:10:21

回答

8

​​是标准库的一部分。因此它不是特别不安全。

但是,在不可靠的意义上,比较非整数浮点值的相等性本质上是不安全的。

这是因为浮点运算的执行精度可能高于您选择的类型,结果会来回转换,并不总是您想象的那样。


在传球,定义诸如宏:

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

&hellip;是不安全的:您可能很容易成为不受欢迎的文本替换的受害者,除此之外它是一个眼睛。

而是使用inline功能,即使inline不保证优化:

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

,然后将同样适用于恒THRESHOLD,它应该仅仅是一个常数C++:

double const threshold = 2*DBL_MIN;