“f” после числа/плавания в 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);
100
задан mskfisher 9 May 2012 в 16:28
поделиться

7 ответов

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

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

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

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

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

87
ответ дан 24 November 2019 в 04:50
поделиться

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

#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 и предыдущего. Думаю, это должно показать, есть ли какие-то реальные различия. Я думаю, что слишком многие имеют видение того, что, по их мнению, делает компилятор, но, в конце концов, нужно знать, как проверять любые теории.

56
ответ дан 24 November 2019 в 04:50
поделиться

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

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. */
42
ответ дан 24 November 2019 в 04:50
поделиться

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

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

5
ответ дан 24 November 2019 в 04:50
поделиться

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

2
ответ дан 24 November 2019 в 04:50
поделиться

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

1
ответ дан 24 November 2019 в 04:50
поделиться

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

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

3
ответ дан 24 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: