正如John所說的帶小數點的數字默認爲雙倍。 TomTom是錯誤的。
我很想知道編譯器是否會優化double float到const float(我認爲會發生這種情況)......事實證明它並不是,速度增加的想法實際上是合法的......取決於你使用它的多少。在數學量大的應用程序中,您可能確實想要使用這個技巧。
它必須是這樣的情況,它將存儲的浮點變量,將其轉換爲double,對double執行數學運算(沒有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);
}
其實 「1.0」 是烏蘇盟友視爲雙重而不是浮動。 – 2010-03-08 15:56:39