使用浮动时我需要使用小数位吗? “f”后缀是否必要?

时间:2010-03-08 15:48:32

标签: iphone objective-c

我在书籍和网络上看到过几个例子,他们有时会在声明浮动值时使用小数位,即使它们是整数,有时使用“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];

那里的十进制零也是为了提醒自己和其他人这个值是浮点数吗?

只是其中一件令我困惑的事情,所以任何澄清都是值得欢迎的。)

3 个答案:

答案 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”可以是样式 - 确保它是浮点数,而不是双精度数。