Мне интересно, какая разница между этими двумя переменными в C:
float price = 3.00;
и
float price = 3.00f;
Задний "f"?
Мне интересно, какая разница между этими двумя переменными в C:
float price = 3.00;
и
float price = 3.00f;
Задний "f"?
3.00
интерпретируется как double
, а не 3.00f
, который рассматривается компилятором как float
.
Суффикс f
просто сообщает компилятору, который является float
и является double
.
См. MSDN (С++)
В дополнение к тому, что уже было сказано, отслеживание 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
Потому что нерекурсированные литералы с плавающей запятой - это двойники, а округление означает, что даже небольшие литералы могут принимать разные значения при округлении до 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));
Проверить @код
3.00 является двойным, 3.00f является поплавком.
Это потому, что тип по умолчанию числовой литерал с плавающей запятой - Символы 3.00 double не плавают. Чтобы сделать этот компилятор, вам нужно добавить суффикс f (или 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
Добавление еще нескольких комбинаций сравнений между типами 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