Подтвердить что ты не робот

Суффикс "f" по плавающей стоимости?

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

float price = 3.00;

и

float price = 3.00f;

Задний "f"?

4b9b3361

Ответ 1

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

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

См. MSDN (С++)

Ответ 2

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

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

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

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

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

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

Ответ 3

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

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

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

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

выводит yes.

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

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

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

Проверить @код

Ответ 4

3.00 является двойным, 3.00f является поплавком.

Ответ 5

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

Ответ 6

Часто разница не важна, так как компилятор все равно преобразует двойную константу в 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

Ответ 7

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

int main()
{
    // Double type constant(3.14) converts to Float type by 
    // truncating it 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