const

2016-01-17 35 views
5

Ben #define ile const yerine kullanılan, ancak aşağıdaki örnekte bu yanlış yazdırır.const

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

Ama

const float x = 3e+38; 

o soru, neden, mükemmel çalışıyor ile

#define x 3e+38 

yerine geçerse? (#define vs const için tartışılan birkaç konu olduğunu biliyorum, ama gerçekten anlamadım, beni aydınlatabilirsin)

+4

Denemek #define x 3e + 38f' –

+0

Waow, ama neden işe yaramadı, neden ve nasıl çalışıyor? –

+0

Float/double değerini karşılaştırmak için '==' kullanmayın – adrianm

cevap

5

C++ 'da literaller çift duyarlıdır. İlk örneklerde, 3e + 38 sayısı ilk olarak değişken başlatmada yüzmeye dönüştürülmüş ve daha sonra karşılaştırmada tekrar çift duyarlığa dönüştürülmüştür. Dönüşümler gerekli değildir, bu yüzden sayılar farklı olabilir. İkinci örnekte numaralar sürekli yüzer. (Değişmez bir şamandıra tanımlayan)

#define x 3e+38f 

bilgileri, sen double için p değiştirebilir düzeltmek veya değişken başlatma aynı dönüşüm gerçekleştirir

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

için karşılaştırma değiştirmek ve yok etmek için daha sonra tek bir hassasiyetle karşılaştırma.

Diğer bir yuvarlama hataları örneğin beklenmeyen sonuçlar, verim olarak, x*y y*x farklı olabilir, genellikle iyi bir fikir değildir == ile kayan nokta sayıları karşılaştırılmasına yorumladı.

+1

Kayan noktaları karşılaştırmanın doğru yolu nedir? –

+0

“A” ve “B” kelimelerini karşılaştırarak, “EPSILON” un küçük bir sayı olduğu (örneğin, '0.0000001') durumda olduğu gibi bir şey yapabilirsiniz. Bazen göreceli hataları karşılaştırmaktan daha iyidir. Ayrıca bkz. Http://stackoverflow.com/questions/17333/most-effective-way-for-float-and-double-comparison –

+0

normal durumda, (a_float == b_float) 'ın hassasiyeti nedir? –

1

3e + 38 sayısı, büyüklüğü nedeniyle iki kat artmıştır.

atama

float p = x; 

p depolandıklarında 3e + 38 hassasiyetini ve dolayısıyla değerini kaybetmesine neden olur.

if(p==x) 

sonuç yanlış çünkü p 3e + 38 den farklı bir değere sahiptir: Karşılaştırma neden

bunlar.

+0

'3e + 38'i yapan büyüklük değil. –