Назначение ".f" добавляется к числу? - PullRequest
49 голосов
/ 28 января 2011

Я увидел «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 используется как приведение?Где-нибудь, где я могу прочитать больше об этом интересном синтаксисе?

Ответы [ 5 ]

55 голосов
/ 28 января 2011

3. эквивалентно 3.0, это двойное число.

f после числового литерала делает его плавающим.

43 голосов
/ 28 января 2011

Без .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 ++ 11 черновик , C ++ 14 черновик , C ++ 17 черновик) или, альтернативно, взгляните на приличный учебник, такой как Язык программирования С ++ * Страуструпа .

В качестве примера, в вашем примере (float)1/3 литералы 1и 3 на самом деле являются целыми числами, но 1 сначала преобразуется в число с плавающей точкой, а затем 3 неявно преобразуется в число с плавающей точкой, потому что это правый операнд оператора с плавающей запятой.(Оператор с плавающей запятой, потому что его левый операнд с плавающей запятой.)

19 голосов
/ 28 января 2011

По умолчанию 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;

Выход:

а не равно 3,2
b равно 3,2f

Поэкспериментируйте здесь на ideone: http://www.ideone.com/WS1az

Попробуйте изменить тип переменной a с float на double, посмотрите результат снова!

8 голосов
/ 28 января 2011

3.f - это сокращение от 3.0f - число 3.0 как литерал с плавающей запятой типа float.

2 голосов
/ 28 января 2011

Десятичная точка и f имеют разное назначение, поэтому это не совсем .f

Вы должны понимать, что в C и C ++ все напечатано, включая литералы.

3 - буквальное целое число. 3. буквальный двойник 3.f - буквальное число с плавающей запятой.

Поплавок IEEE имеет меньшую точность, чем двойной. float использует только 32 бита, с 22-битной мантиссой и 10-битной экспонентой (включая знаковые биты каждого).

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

Таким образом, float по-прежнему полезный тип.

Не следует путать это с нотацией, используемой printf, и эквивалентными операторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...