2016-01-17 32 views
5

我用const代替#define,但在下面的例子中它打印出falseconst vs #define(奇怪的行爲)

#include <iostream> 
#define x 3e+38 

using namespace std; 

int main() { 
    float p = x; 
    if (p==x) 
     cout<<"true"<<endl; 
    else 
     cout<<"false"<<endl; 
return 0; 
} 

但是如果我更換

#define x 3e+38 

const float x = 3e+38; 

它完美的作品,問題是爲什麼呢? (我知道有幾個主題討論#define與const,但真的沒有得到這個,請賜教)

+4

嘗試'#define x 3e + 38f' –

+0

Waow,但爲什麼這樣不起作用,以及爲什麼以及如何工作? –

+0

不要用'=='來比較float/double – adrianm

回答

5

在c + +文字是雙精度。在第一個例子中,數字3e + 38首先被轉換爲在變量初始化中浮動,然後在比較中返回到雙精度。轉換不是必須的,所以數字可能會有所不同。在第二個例子中,數字始終處於浮動狀態。爲了修正它可以改變pdouble,寫

#define x 3e+38f 

(定義文字浮子),或改變比較

if (p == static_cast<float>(x)) 

,其執行相同的轉換爲變量初始化,並執行然後以單精度進行比較。

另外,作爲評價浮點數與==的比較通常不是一個好主意,因爲舍入誤差產生意外的結果,例如,x*y可能來自不同y*x

+1

什麼是比較浮點的正確方法? –

+0

簡而言之,比較'A'和'B',你可以根據情況做'if(fabs(A-B)

+0

在正常情況下,「(a_float == b_float)'的精度是多少? –

1

3e + 38的數量是其數量的兩倍。

分配

float p = x; 

使存儲在p當3E + 38失去其精度,因此它的值。

這就是爲什麼比較:

if(p==x) 

導致假的,因爲p比3E + 38個不同的值。

+0

這不是讓'3e + 38 –