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

Лучше ли писать 0.0, 0.0f или .0f вместо простого 0 для предполагаемых плавающих или двойных значений

Привет, все в заголовке. Этот вопрос применяется, в частности, для всех тех значений, которые могут быть как NSTimeInterval, CGFloat или любой другой переменной, которая является поплатой или двойным. Спасибо.

EDIT: Я запрашиваю присвоение значения не в формате в строке.

РЕДАКТИРОВАТЬ 2: Вопрос в том, действительно ли присваивание простой 0 для float или double является худшим чем что-либо с f a end.

4b9b3361

Ответ 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; вы всегда находитесь на безопасном сайте.