Нужно ли использовать десятичные разряды при использовании чисел? Нужен ли суффикс "f"? - PullRequest
3 голосов
/ 08 марта 2010

Я видел несколько примеров в книгах и в Интернете, где они иногда используют десятичные разряды при объявлении значений с плавающей запятой, даже если они являются целыми числами, а иногда с использованием суффикса "f". Это необходимо?

Например:

[UIColor colorWithRed:0.8 green:0.914 blue:0.9 alpha:1.00];

Чем это отличается от:

[UIColor colorWithRed:0.8f green:0.914f blue:0.9f alpha:1.00f];

Означает ли буква "f" что-то особенное?

Избавление от конечных нулей для значения альфа также работает, поэтому оно становится:

[UIColor colorWithRed:0.8 green:0.914 blue:0.9 alpha:1];

Так есть ли здесь десятичные нули, чтобы напомнить себе и другим, что значение - это число с плавающей запятой?

Просто одна из тех вещей, которые озадачили меня, поэтому любые разъяснения приветствуются:)

Ответы [ 3 ]

5 голосов
/ 08 марта 2010

Десятичные литералы по умолчанию считаются двойными. Использование 1.0f указывает компилятору использовать вместо него значение с плавающей точкой (которое меньше двойного). В большинстве случаев не имеет значения, является ли число двойным или плавающим, компилятор позаботится о том, чтобы в конце вы получили правильный формат для работы. В высокопроизводительном коде вы можете захотеть быть явным, но я бы посоветовал сравнить его самостоятельно.

2 голосов
/ 22 февраля 2012

Как сказал Джон, числа с десятичной точкой по умолчанию удваиваются. TomTom не прав.

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

Должно быть, это тот случай, когда он берет сохраненную переменную с плавающей запятой, приводит ее к двойному, выполняет математику против двойного (число без f), а затем возвращает его обратно к плавающему, чтобы сохранить его снова. Это объяснило бы разницу в вычислениях, хотя мы храним в плавающих каждый раз.

Код и необработанные результаты: https://gist.github.com/1880400

Вытащил соответствующий бенчмарк на iPad 1 в профиле отладки (Релиз привел к еще большему увеличению производительности , увеличению с помощью обозначения f):

------------ 10000000 total loops
timeWithDoubles: 1.33593 sec
timeWithFloats: 0.80924 sec
Float speed up: 1.65x
Difference in calculation: -0.000038

Код:

int main (int argc, const char * argv[]) {
  for (unsigned int magnitude = 100; magnitude < INT_MAX; magnitude *= 10) {
    runTest(magnitude);
  }
  return 0;
}

void runTest(int numIterations) {
  NSTimeInterval startTime = CFAbsoluteTimeGetCurrent();
  float d = 1.2f;
  for (int i = 0; i < numIterations; i++) {
    d += 1.8368383;
    d *= 0.976;
  }
  NSTimeInterval timeWithDoubles = CFAbsoluteTimeGetCurrent() - startTime;

  startTime = CFAbsoluteTimeGetCurrent();
  float f = 1.2f;
  for (int i = 0; i < numIterations; i++) {
    f += 1.8368383f;
    f *= 0.976f;
  }
  NSTimeInterval timeWithFloats = CFAbsoluteTimeGetCurrent() - startTime;
  printf("\n------------ %d total loops\n", numIterations);
  printf("timeWithDoubles: %2.5f sec\n", timeWithDoubles);
  printf("timeWithFloats: %2.5f sec\n", timeWithFloats);
  printf("Float speed up: %2.2fx\n", timeWithDoubles / timeWithFloats);
  printf("Difference in calculation: %f\n", d - f);
}
0 голосов
/ 08 марта 2010

Трейлинг f: это число с плавающей точкой.

Трейлинг f + "." - избыточный.

Так просто.

8f равно 8 в качестве числа с плавающей запятой.

8.0 - это число 8 с плавающей запятой.

8 равно 8 как целое число.

8.0f равно 8 как число с плавающей запятой.

В большинстве случаев «f» может быть стилем - чтобы быть уверенным, что это число с плавающей точкой, а не двойное число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...