Суффикс "f" на значение float?
мне интересно, в чем разница между этими двумя переменными в C:
float price = 3.00;
и
float price = 3.00f;
трейлинг "f"?
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
часто разница не важна, так как компилятор все равно преобразует двойную константу в 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