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

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

4b9b3361

Ответ 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 и эквивалентными утверждениями.