Я был поражен этим странным поведением:Странное поведение при сравнении поплавка с постоянным
float pi = 3.14;
if(pi == 3.14)
cout << "OK";
else
cout << "How is it possible?";
Может кто-нибудь объяснить это?
Я был поражен этим странным поведением:Странное поведение при сравнении поплавка с постоянным
float pi = 3.14;
if(pi == 3.14)
cout << "OK";
else
cout << "How is it possible?";
Может кто-нибудь объяснить это?
Постоянная в заявке 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?";
Поскольку значения по умолчанию, как 3.14
рассматриваются как двойные, но хранение один из этого значения в переменном поплавке приводит к потере точности; и поэтому существуют микроскопические различия, связанные с различными прецизионностями. Вот почему номера с плавающей запятой не следует сравнивать напрямую большую часть времени.
Вы забыли описать поведение, и это было странно. –
Ваш 'pi' является' 3.1400001049041748046875' (13170115 * 2^-22), и вы сравниваете его с '3.140000000000000124344978758017532527446746826171875' (7070651414971679 * 2^-51). Конечно, они не равны. – Cubbi
Возможный дубликат [Поплавковое сравнение дает разные результаты] (http://stackoverflow.com/questions/7580352/float-comparison-gives-different-results) –