Назначение ".f" прилагается к числу?
Я видел "1/3.f" в программе и задавался вопросом, что такое ".f". Поэтому я попробовал свою собственную программу:
#include<iostream>
using namespace std;
int main()
{
cout<<(float)1/3<<endl;
cout<<1/3.f<<endl;
cout<<1/3<<endl;
}
Используется ли .f как прилив? В любом месте, где я могу больше узнать об этом интересном синтаксисе?
Ответы
Ответ 1
Без .f
это число интерпретируется как целое число, поэтому 1/3
является (int)1/(int)3
=> (int)0
вместо желаемого (float)0.333333
. .f
сообщает компилятору интерпретировать литерал как число с плавающей запятой типа float. Существуют и другие такие конструкции, такие как, например, 0UL
что означает (unsigned long)0
, тогда как простая 0
будет (int)0
.
На самом деле .f
на самом деле две компоненты .
который указывает, что литерал является числом с плавающей запятой, а не целым числом, и суффикс f
который сообщает компилятору, что литерал должен иметь тип float, а не двойной тип по умолчанию, используемый для литералов с плавающей точкой.
Отказ от ответственности; "конструкция литья", используемая в приведенном выше объяснении, не является фактическим произведением, а просто способом указать тип литерала.
Если вы хотите знать все о литералах и суффиксах, которые вы можете использовать в них, вы можете прочитать стандарт C++, проект проекта 1997 года C++, проект C++ 14, проект C++ 17) или, альтернативно,, посмотрите на достойный учебник, такой как Stroustrup C++ Язык программирования.
Как и в сторону, в вашем примере (float)1/3
литералы 1
и 3
на самом деле являются целыми числами, но 1 сначала бросается в поплавок с помощью вашего броска, а затем 3 неявно бросается в поплавок, потому что он имеет право операнд оператора с плавающей запятой. (Оператор является плавающей точкой, потому что его левый операнд является плавающей точкой.)
Ответ 2
3.
эквивалентен 3.0
, это двойной.
f
после числового литерала делает его плавающим.
Ответ 3
По умолчанию 3.2
рассматривается как double
; поэтому, чтобы заставить компилятор обрабатывать его как float
, вам нужно написать f
в конце.
Просто посмотрите эту интересную демонстрацию:
float a = 3.2;
if ( a == 3.2 )
cout << "a is equal to 3.2"<<endl;
else
cout << "a is not equal to 3.2"<<endl;
float b = 3.2f;
if ( b == 3.2f )
cout << "b is equal to 3.2f"<<endl;
else
cout << "b is not equal to 3.2f"<<endl;
Вывод:
a не равно 3.2. b равно 3.2f
Проведите эксперимент здесь в ideone: http://www.ideone.com/WS1az
Попробуйте изменить тип переменной a
от float
до double
, снова посмотрите на результат!
Ответ 4
3.f является short для 3.0f - число 3.0 как литерал с плавающей запятой типа float.
Ответ 5
Десятичная точка и f имеют другую цель, поэтому на самом деле это не так .f
Вы должны понимать, что в C и С++ все напечатано, включая литералы.
3 - буквальное целое число.
3. является буквальным двойным
3.f - это буквальное поплавок.
Поплавок IEEE имеет меньшую точность, чем двойной. float использует только 32 бита с 22-битным мантиссой и 10-битным показателем (включая знаковые бит каждого).
double дает вам больше точности, но иногда вам не нужна такая точность (например, если вы делаете расчеты на цифрах, которые являются только оценками в первую очередь), и для данных, данных float, будет достаточно, и если вы будете хранить большие числа из них (например, обработка большого количества данных временных рядов), которые могут быть важнее точности.
Таким образом, float по-прежнему является полезным типом.
Вы не должны путать это с нотацией, используемой printf и эквивалентными утверждениями.