我在书籍和网络上看到过几个例子,他们有时会在声明浮动值时使用小数位,即使它们是整数,有时使用“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”是否意味着什么特别的?
除去alpha值的尾随零也有效,因此它变为:
[UIColor colorWithRed:0.8 green:0.914 blue:0.9 alpha:1];
那里的十进制零也是为了提醒自己和其他人这个值是浮点数吗?
只是其中一件令我困惑的事情,所以任何澄清都是值得欢迎的。)
答案 0 :(得分:5)
默认情况下,十进制文字被视为double。使用1.0f告诉编译器使用float(小于double)。在大多数情况下,如果数字是double或float,并不重要,编译器将确保您最终获得正确的作业格式。在高性能代码中,您可能希望明确,但我建议您自己进行基准测试。
答案 1 :(得分:2)
正如约翰所说,带小数位的数字默认为加倍。 TomTom错了。
我很想知道编译器是否只是将double优化为const float(我假设会发生)...事实证明它没有,并且速度增加的想法实际上是合法的...取决于你用了多少钱。在数学繁重的应用程序中,您可能确实想要使用这个技巧。
必须是这样的情况:它正在获取存储的float变量,将其转换为double,对double执行数学运算(不带f的数字),然后将其转换回float以再次存储它。这可以解释计算上的差异,即使我们每次都存储在浮点数中。
代码&原始结果: 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 :(得分:-2)
尾随f:这是一个浮动。
落后f +“。” - 多余。
那很简单。
8f是浮动的8。
8.0是浮动的8。
8是8整数。
8.0f是浮动的8。
大多数情况下,“f”可以是样式 - 确保它是浮点数,而不是双精度数。