2013-02-25 44 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;