typ*_*ror 100 c floating-point objective-c
我在Apple文档中找不到这个:这里的数字后面的"f"表示什么?这是来自C还是Objective-C?不将它添加到常数中有什么区别吗?
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
Run Code Online (Sandbox Code Playgroud)
你能解释一下为什么我不会写:
CGRect frame = CGRectMake(0, 0, 320, 50);
Run Code Online (Sandbox Code Playgroud)
Fra*_*rar 87
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
Run Code Online (Sandbox Code Playgroud)
使用浮点常量.(常量0.0通常在Objective-C中声明一个double;在结尾处放置一个f - 0.0f - 将常量声明为(32位)float.)
CGRect frame = CGRectMake(0, 0, 320, 50);
Run Code Online (Sandbox Code Playgroud)
使用将自动转换为浮点数的整数.
在这种情况下,两者之间没有(实际)差异.
epa*_*tel 56
如有疑问,请检查汇编器输出.例如,写一个小的,最小的片段,就像这样
#import <Cocoa/Cocoa.h>
void test() {
CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
NSLog(@"%f", r.size.width);
}
Run Code Online (Sandbox Code Playgroud)
然后使用该-S
选项将其编译为汇编程序.
gcc -S test.m
Run Code Online (Sandbox Code Playgroud)
将汇编器输出保存在test.s
文件中并.0f
从常量中删除并重复编译命令.然后做一个diff
新的test.s
和前一个.认为应该显示是否存在任何真正的差异.我想太多人对他们认为编译器的作用有一个看法,但在一天结束时,人们应该知道如何验证任何理论.
Pot*_*ter 42
有时候会有所不同.
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. */
Run Code Online (Sandbox Code Playgroud)
Nic*_*kLH 24
它告诉计算机这是一个浮点数(我假设你在这里谈论c/c ++).如果数字后面没有f,则认为是双精度或整数(取决于是否有小数).
3.0f -> float
3.0 -> double
3 -> integer
Run Code Online (Sandbox Code Playgroud)
源代码中的浮点文字被解析为双精度型。将其分配给float类型的变量将失去精度。非常精确,您丢掉了7位有效数字。“ f”后缀让您告诉编译器:“我知道我在做什么,这是有意的。不要为此烦我”。
产生错误的几率并不小。许多程序都考虑到了浮点数比较不当或假定0.1可以精确表示的情况。
将f
你所谈论的是大概意思告诉编译器,它的工作有浮动。当您省略 时f
,它通常被转换为双精度。
两者都是浮点数,但 afloat
使用的位数比 a 少(因此更小且精度更低)double
。