Суффикс "f" по значению с плавающей точкой? - PullRequest
64 голосов
/ 17 февраля 2011

Мне интересно, в чем разница между этими двумя переменными в C:

float price = 3.00;

и

float price = 3.00f;

Трейлинг "f"?

Ответы [ 7 ]

65 голосов
/ 17 февраля 2011

3.00 интерпретируется как double, в отличие от 3.00f, который рассматривается компилятором как float.

Суффикс f просто сообщает компилятору, который являетсяfloat и double.

См. MSDN (C ++)

33 голосов
/ 17 февраля 2011

В дополнение к тому, что уже было сказано, отслеживание 1.0 против 1.0f является более важным, чем думают многие.Если вы напишите код, подобный следующему:

float x;
...
float y = x * 2.0;

, тогда x будет повышен до двойного, потому что 2.0 - двойной.Компилятору запрещено оптимизировать эту рекламу, иначе это будет нарушать стандарт Си.Расчет выполняется с двойной точностью, а затем результат неявно усекается в число с плавающей точкой.Это означает, что вычисление будет медленнее (хотя и более точным), чем это было бы, если бы вы написали 2.0f или 2.

Если бы вы написали 2, константа имела бы тип int, который был бы повышенв поплавок, и расчет был бы сделан с «точностью поплавка».Хороший компилятор предупредит вас об этой акции.

Подробнее о правилах «обычного арифметического преобразования» читайте здесь:

http://msdn.microsoft.com/en-us/library/3t4w2bkb%28v=vs.80%29.aspx

11 голосов
/ 06 июля 2013

Потому что при отсутствии суффиксов литералы с плавающей запятой являются двойными, а округление означает, что даже маленькие литералы могут принимать разные значения при округлении до числа с плавающей запятой и двойного числа. Это можно наблюдать в следующем примере:

float f=0.67;
if(f == 0.67) 
  printf("yes");
else 
  printf("no");  

Это выведет no, потому что 0.67 имеет другое значение при округлении до значения с плавающей запятой, чем при округлении до двойного значения. С другой стороны:

float f=0.67;
if(f == 0.67f) 
  printf("yes");
else 
  printf("no"); 

выходы yes.

Суффикс может быть задан прописными или строчными буквами.

Попробуйте также:

printf(" %u %u\n", sizeof(.67f), sizeof(.67));

Check @ кодовый код

5 голосов
/ 17 февраля 2011

3,00 - двойное число, 3,00f - число с плавающей запятой.

0 голосов
/ 22 декабря 2016

Добавление еще нескольких комбинаций сравнений между типами данных float и double.

int main()
{
    // Double type constant(3.14) converts to Float type by 
    // truncating it's bits representation 
    float a = 3.14; 
    // Problem: float type 'a' promotes to double type and the value 
    // of 'a'  depends on how many bits added to represent it.
    if(a == 3.14)   
        std::cout<<"a: Equal"<<std::endl;
    else
        std::cout<<"a: Not Equal"<<std::endl; 

    float b = 3.14f; // No type conversion
    if(b == 3.14)    // Problem: Float to Double conversion
        std::cout<<"b: Equal"<<std::endl;
    else
        std::cout<<"b: Not Equal"<<std::endl;

    float c = 3.14; // Double to Float conversion (OK even though is not a good practice )
    if(c == 3.14f)  // No type conversion 
        std::cout<<"c: Equal"<<std::endl;  // OK
    else
        std::cout<<"c: Not Equal"<<std::endl;

    float d = 3.14f;
    if(d == 3.14f)
        std::cout<<"d: Equal"<<std::endl; // OK
    else
        std::cout<<"d: Not Equal"<<std::endl;

    return 0;
}    

Выход:

 a: Not Equal
 b: Not Equal
 c: Equal
 d: Equal
0 голосов
/ 17 февраля 2011

Часто разница не важна, так как компилятор все равно преобразует двойную константу в число с плавающей точкой.Однако учтите это:

template<class T> T min(T a, T b)
{
  return (a < b) ? a : b;
}

float x = min(3.0f, 2.0f); // will compile
x = min(3.0f, 2);   // compiler cannot deduce T type
x = min(3.0f, 2.0); // compiler cannot deduce T type
0 голосов
/ 17 февраля 2011

Это потому, что по умолчанию тип числового литерала с плавающей запятой - символы 3.00 двойные, а не числа с плавающей запятой.Для этого вам нужно добавить суффикс f (или F).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...