Лучше ли писать 0.0, 0.0f или .0f вместо простого 0 для предполагаемых плавающих или двойных значений
Привет, все в заголовке. Этот вопрос применяется, в частности, для всех тех значений, которые могут быть как NSTimeInterval
, CGFloat
или любой другой переменной, которая является поплатой или двойным. Спасибо.
EDIT: Я запрашиваю присвоение значения не в формате в строке.
РЕДАКТИРОВАТЬ 2: Вопрос в том, действительно ли присваивание простой 0
для float или double является худшим чем что-либо с f
a end.
Ответы
Ответ 1
Основное отличие:
1.0
или 1.
является двойной константой
1.0f
- постоянная поплавка
Без суффикса литерал с десятичной точкой в нем (123.0) будет рассматриваться как число с плавающей запятой с двойной точностью. Если вы назначаете или передаете это переменной или параметру с одной точностью, компилятор должен (должен) выдавать предупреждение. Добавление f
указывает компилятору, что вы хотите, чтобы литерал обрабатывался как число с плавающей запятой с одной точностью.
Ответ 2
Если вы инициализируете переменную, то это не имеет смысла. компилятор делает все броски для вас.
float a = 0; //Cast int 0 to float 0.0
float b = 0.0; //Cast 0.0 double to float 0.0 as by default floating point constants are double
float c = 0.0f // Assigning float to float. .0f is same as 0.0f
Но если вы используете их в выражении, то это имеет большой смысл.
6/5 becomes 1
6/5.0 becomes 1.2 (double value)
6/5.0f becomes 1.2 (float value)
Ответ 3
Если вы хотите выкапывать, если есть какая-либо разница с целевым ЦП, выполняющим код или исполняемый им двоичный код, вы можете легко скопировать одну из команд, компилирующих код из XCode в командную строку, исправить отсутствующие переменные среды и добавьте -S. Благодаря этому вы получите сборку, которую вы можете использовать для сравнения. Если вы поместите все 4 варианта в маленький примерный исходный файл, вы можете сравнить полученный после этого код сборки, даже не будучи свободным в сборке ARM.
Из моего опыта сборки ARM (хорошо... 6 лет назад и GCC) я бы поставил 1ct на что-то вроде XORing регистра с собой, чтобы очистить его до 0.
Ответ 4
Если вы используете 0.0,.0 или 0.0f или даже 0f, это не имеет большого значения. (Есть некоторые в отношении double и float). Вы можете даже использовать (float) 0.
Но есть значительная разница между 0 и некоторыми обозначениями с плавающей запятой. Zero всегда будет некоторым типом целого числа. И это может заставить машину выполнять целые операции, когда вы можете использовать операции с плавающей запятой.
У меня нет хорошего примера для нулевого удобства, но у меня есть один для float/int в целом, который на прошлой неделе меня сбил с ума.
Я привык к 8-битным цветам RGB Это из-за моего хобби как фотографа и из-за моего недавнего опыта работы в качестве разработчика html. Поэтому мне было трудно привыкнуть к cocoa стилю 0..1 фракций красного, зеленого и желтого. Чтобы преодолеть это, я хотел использовать значения, к которым я привык, и делить их на 255.
[CGColor colorWithRed: 128/255 green: 128/255 andYellow: 128/255];
Это должно создать мне приятный серебристый серый цвет. Но это не так. Все, что я пробовал, сделало черным или белым.
Сначала я подумал, что это было вызвано некоторой недокументированной спецификацией текстовых объектов пользовательского интерфейса, которыми я пользовался этим цветом. Потребовалось некоторое время, чтобы понять, что эти постоянные значения вызывают целочисленные операции, которые могут только округлять вверх или вниз до 0 и 1.
В конечном итоге это изгнание сделало то, что я хотел достичь:
[CGColor colorWithRed: 128.0/255.0 green: 128.0/255.0 andYellow: 128.0/255.0];
Вы могли бы добиться того же, что и при использовании .0s. Но не больно иметь больше их по мере необходимости. 128.0f/(float) 255 будет делать.
Отредактируйте, чтобы ответить на ваш "Редактировать2":
float fvar;
fvar = 0;
vs...
fvar = .0;
В конце концов, это не имеет никакого значения. fvar будет содержать значение float, близкое к (но не всегда равному) 0.0. Для компиляторов в 60-е и 70-е годы я бы предположил, что существует незначительная проблема с производительностью, связанная с fvar = 0
. Это значит, что компилятор сначала создает int 0, который затем должен быть преобразован в float перед назначением. Современные компиляторы сегодня должны оптимизироваться автоматически намного лучше, чем старые. В конце концов, мне пришлось бы посмотреть на вывод машинного кода, чтобы увидеть, действительно ли это имеет значение.
Однако с fvar = .0;
вы всегда находитесь на безопасном сайте.