Суффикс "f" на значение float?


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

float price = 3.00;

и

float price = 3.00f;

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

7 58

7 ответов:

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

The f суффикс просто говорит компилятору, который является float и double.

посмотреть MSDN (C++)

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

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

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

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

подробнее о "обычные арифметические преобразования" правила:

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

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

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

это позволит вывести no, потому что 0.67 имеет другое значение при округлении до float, чем при округлении до double. С другой стороны:

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

выходы yes.

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

попробуй это:

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

проверить @codepade

3.00-двойной, 3.00 f-поплавок.

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

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

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

добавление еще нескольких комбинаций сравнений между типами данных 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