2012-05-31 2 views
1

Я был поражен этим странным поведением:Странное поведение при сравнении поплавка с постоянным

float pi = 3.14; 

if(pi == 3.14) 
    cout << "OK"; 
else 
    cout << "How is it possible?"; 

Может кто-нибудь объяснить это?

+1

Вы забыли описать поведение, и это было странно. –

+2

Ваш 'pi' является' 3.1400001049041748046875' (13170115 * 2^-22), и вы сравниваете его с '3.140000000000000124344978758017532527446746826171875' (7070651414971679 * 2^-51). Конечно, они не равны. – Cubbi

+0

Возможный дубликат [Поплавковое сравнение дает разные результаты] (http://stackoverflow.com/questions/7580352/float-comparison-gives-different-results) –

ответ

4

Постоянная в заявке if: (double)3.14. Он очень близок к его версии float, но точно не соответствует ему, потому что 3.14 не представлен точно.

Пробуйте тот же трюк с 1.25 или любым другим номером, который может быть представлен точно, и вы получите OK.

float num = 1.25; 
if(num == 1.25) 
    cout << "OK"; 
else 
    cout << "How is it possible?"; 

Вы также можете бросить 3.14 к float, чтобы получить OK:

float pi = 3.14; 

if(pi == (float)3.14) 
    cout << "OK"; 
else 
    cout << "How is it possible?"; 
+0

Спасибо за ваш ответ – Nick

+1

Вместо '(float) 3.14' вы можете просто написать' 3.14f' («f» означает, что это 'float', а не' double'. – Matt

1

Поскольку значения по умолчанию, как 3.14 рассматриваются как двойные, но хранение один из этого значения в переменном поплавке приводит к потере точности; и поэтому существуют микроскопические различия, связанные с различными прецизионностями. Вот почему номера с плавающей запятой не следует сравнивать напрямую большую часть времени.

Смежные вопросы