编号后的“ f”


102

是什么在f后的数字表示?这是C还是Objective-C的?不将其加到常数上有什么区别吗?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

你能解释为什么我不只是写:

CGRect frame = CGRectMake(0, 0, 320, 50);

Answers:


88
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

使用浮点常量。(常数0.0通常在Objective-C中声明一个双精度;在末尾加一个f-0.0f-将该常数声明为(32位)浮点数。)

CGRect frame = CGRectMake(0, 0, 320, 50);

使用整数,该整数将自动转换为浮点数。

在这种情况下,两者之间没有(实际的)区别。


24
从理论上讲,编译器可能不够聪明,无法在编译时将它们转换为浮点型,并且会通过四次int-> float转换(属于最慢的转换)来减慢执行速度。尽管在这种情况下几乎不重要,但最好总是根据需要正确地指定f:在表达式中没有正确说明符的常量可能会强制将整个表达式转换为双精度,并且如果处于紧密循环中,则可能会降低性能显。
Matteo Italia 2010年

60

如有疑问,请检查汇编器输出。例如,写一个很小的最小片段

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

然后使用该-S选项将其编译为汇编器。

gcc -S test.m

将汇编程序输出保存在test.s文件中,然后.0f从常量中删除并重复执行compile命令。然后做一个diff新的test.s和上一个。认为这应该表明是否存在任何实际差异。我想太多有一个愿景,他们怎么想的编译器,但在一天结束的时候应该知道如何验证任何理论。


11
结果对我来说是相同的,即使没有任何输出-O。我使用的是i686-apple-darwin10-gcc-4.2.1(GCC)
kizzx2,2011年

2
我使用LLVM 7.0.0(clang-700.0.65)x86_64-apple-darwin15.0.0尝试了上述示例,.out文件也相同。
尼克

43

有时会有区别。

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */

26

它告诉计算机这是一个浮点数(我假设您在这里谈论的是c / c ++)。如果数字后面没有f,则将其视为双精度或整数(取决于是否存在小数)。

3.0f -> float
3.0 -> double
3 -> integer

这个约定是C ++标准的一部分还是在编译器中找到?
jxramos

1
据我所知,它是标准的一部分(如果我错了,请纠正我)。我能找到的最快的参考文献是open-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon,但是如果您愿意寻找它们,可能还会有更多最新的参考文献。
NickLH 2015年

5

源代码中的浮点文字会被解析为双精度型。将其分配给float类型的变量将失去精度。精度很高,您丢掉了7个有效数字。“ f”后缀让您告诉编译器:“我知道我在做什么,这是有意的。不要为此烦我”。

产生错误的几率并不小。许多程序都考虑到了浮点数比较不当或假定0.1可以精确表示的情况。


4

f你所谈论的是大概意思告诉编译器,它的工作有浮动。当您省略f,通常会转换为双精度。

两者都是浮点数,但是a比a float使用更少的位(因此更小且精度更低)double


3

这是C东西-浮点字面量默认情况下是双精度(double)。添加f后缀会使它们具有单精度(浮点数)。

您可以在此处使用int来指定值,在这种情况下,这没有什么区别,但是使用正确的类型是一种好的习惯-一致性通常是一件好事,如果以后需要更改这些值,则可以乍一看它们是什么类型。


2

从C开始。它表示float常量。您可以省略“ f”和“ .0”并在示例中使用ints,因为int会隐式转换为float。


1

几乎可以肯定,它来自C语言,反映了使用“浮点数”而不是“双精度”类型的愿望。它类似于数字上的后缀,例如L,表示它们是长整数。您可以只使用整数,编译器将在适当的情况下自动转换(针对此特定方案)。


0

它通常告诉编译器该值为a float,即浮点整数。这意味着它可以存储整数,小数值和指数,例如10.41.2e+22

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.