2010-03-08 337 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

相关问题