2010-03-08 334 views
3

我在書籍和網絡中看到過幾個例子,他們有時在聲明浮點值時使用小數位,即使它們是整數,有時也使用「f」後綴。這是必要的嗎?使用浮點數時需要使用小數位嗎? 「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]; 

所以是小數零隻是提醒自己和其他人的價值是浮動?

的是一直困擾我的那些事情只是一個,所以任何澄清都是歡迎的。

回答

2

正如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); 
} 
-2

尾隨F:這是一個浮動。

落後f +「。」 - 多餘。

那很簡單。

8f是8作爲浮點數。

8.0是8作爲浮點數。

8是8整數。

8.0f爲8浮點數。

大多數「f」可以是風格 - 以確保它是一個浮動,而不是一個雙。

+3

其實 「1.0」 是烏蘇盟友視爲雙重而不是浮動。 – 2010-03-08 15:56:39

5

默認情況下,小數文字被視爲雙精度。使用1.0f告訴編譯器使用浮點數(小於double)。在大多數情況下,數字是雙精度還是浮點數並不重要,編譯器將確保您最終獲得正確的格式。在高性能代碼中,您可能想要明確,但我建議您自己對其進行基準測試。

+2

接下來:第一代iPhone沒有原生的雙精度支持(它是在軟件仿真中處理的),所以程序員已經開始增加「f」來提升性能。 – 2010-03-08 16:12:50

相關問題