"f" после числа /float в Objective-C/C

Я не могу найти это в документах Apple так: что означает "f" после цифр здесь? Это от C или Objective-C? Есть ли разница в том, чтобы не добавлять это к постоянному числу?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

Можете ли вы объяснить, почему я бы просто не писал:

CGRect frame = CGRectMake(0, 0, 320, 50);

Ответ 1

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

использует константы float. (Константа 0.0 обычно объявляет двойной в Objective-C, помещая f в конец - 0.0f - объявляет константу как (32-разрядный) float.)

CGRect frame = CGRectMake(0, 0, 320, 50);

использует ints, который будет автоматически преобразован в float.

В этом случае нет (практической) разницы между ними.

Ответ 2

В случае сомнений проверьте выход ассемблера. Например, напишите небольшой минимальный фрагмент, например,

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

Затем скомпилируйте его на ассемблер с опцией -S.

gcc -S test.m

Сохраните вывод ассемблера в файле test.s и удалите .0f из констант и повторите команду компиляции. Затем выполните diff нового test.s и предыдущего. Думайте, что это должно показать, есть ли какие-либо реальные различия. Я думаю, что слишком многие видят то, что, по их мнению, делает компилятор, но в конце дня нужно знать, как проверять любые теории.

Ответ 3

Иногда есть разница.

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */

Ответ 4

Он сообщает компьютеру, что это число с плавающей запятой (я предполагаю, что вы говорите о c/С++ здесь). Если после номера нет f, это считается двойным или целым (в зависимости от того, существует ли десятичная или нет).

3.0f -> float
3.0 -> double
3 -> integer

Ответ 5

Литерал с плавающей запятой в исходном коде анализируется как двойной. Присвоение переменной переменной типа float потеряет точность. Много точности, вы выбрасываете 7 значащих цифр. Постфикс "f" позволяет вам рассказать компилятору: "Я знаю, что делаю, это намеренно. Не ждите меня об этом".

Вероятность создания ошибки не такая маленькая. Многие программы перешли на плохо продуманное сравнение с плавающей запятой или предположили, что 0,1 точно представимо.

Ответ 6

f, о котором вы говорите, вероятно, означает сообщить компилятору, что он работает с плавающей точкой. Когда вы опускаете f, он обычно переводится в double.

Оба являются числами с плавающей запятой, но float использует меньше бит (таким образом, меньше и менее точный), чем double.

Ответ 7

Это объект C - литералы с плавающей запятой по умолчанию являются двойной точностью (двойной). Добавление суффикса f делает их одинарной точностью (float).

Вы можете использовать ints для указания значений здесь, и в этом случае это не имеет значения, но использование правильного типа - хорошая привычка вступать - согласованность - это хорошо в целом, и если вам нужно изменить эти значения позже вы будете знать с первого взгляда, какой тип они являются.

Ответ 8

Из C. Это означает постоянную поплавкового литерала. Вы можете опустить как "f", так и ".0" и использовать ints в вашем примере из-за неявного преобразования ints в float.

Ответ 9

Это почти наверняка из C и отражает желание использовать "float", а не "double". Он похож на суффиксы, такие как L на числах, чтобы указать, что они являются длинными целыми числами. Вы можете просто использовать целые числа, и компилятор автоматически преобразует их (для этого конкретного сценария).

Ответ 10

Обычно он сообщает компилятору, что это значение float, то есть целое число с плавающей запятой. Это означает, что он может хранить целые числа, десятичные значения и экспоненты, например. 1, 0.4 или 1.2e+22.