2012-04-28 1 views
4

Можно создать дубликат:
strange output in comparision of float with float literal
Why comparing double and float leads to unexpected result?Есть ли 3.5 и 3.5f то же самое в C++?

В следующий код я ожидал ответа быть "не равно", потому что по умолчанию 3.5 должен быть в C++ double, но результат был «равным».

Какая разница в объявлении float a=3.5f и float a=3.5?

#include<iostream> 
using namespace std; 

int main() 
{ 
    float a=3.5; 
    if(a==3.5) 
     cout<<"equal"<<endl; 
    else 
     cout<<"Not equal"<<endl; 
    return 0; 
} 
+0

Попробуйте создать двойной и плавающий, которые равны 1.0/3.0, а затем увидите, если они равны. Вы обнаружите, что это не так. – Benj

+0

Да, Бенй, я понял. То, что вы хотите сказать, это не одинаковые из-за точности. –

+0

при сравнении значений с плавающей запятой для равенства Я всегда использую: fabs (v1-v2) marcinj

ответ

13

Номер

Тип 3.5 является double в то время как тип 3.5f с плавающей точкой. То же, что не гарантируется на уровне.

#include<iostream> 

void f(double) { std::cout << "it is double" << std::endl; } 
void f(float) { std::cout << "it is float" << std::endl; } 

int main() 
{ 
    f(3.5); 
    f(3.5f); 
} 

Output:

it is double 
it is float 
+2

'3.5 == 3.5f' * * гарантировано IEEE754, что большинство« нормальных »систем используйте эти дни. – fredoverflow

+0

Но 10.0f/3.0f не гарантирует 10.0/3.0. Ему удалось выбрать точный номер. –

+0

@FredOverflow: Да, * "3.5 == 3.5f гарантируется IEEE754" *, но он не гарантируется C++, так как реализация может выбрать * любой * формат с плавающей запятой. – Nawaz

2

Float не точное число. Сравнение их с == никогда не является хорошей идеей. Вот почему: What Every Computer Scientist Should Know About Floating-Point Arithmetic

+8

Floats _do_ представляют собой точные числа; однако есть много чисел, которые не могут быть представлены никаким поплавком. – Mankarse