Как сказал Джон, числа с десятичной точкой по умолчанию удваиваются. 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);
}