Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone-20.0和20.0f之间的差异_Iphone_Ios_Xcode - Fatal编程技术网

iPhone-20.0和20.0f之间的差异

iPhone-20.0和20.0f之间的差异,iphone,ios,xcode,Iphone,Ios,Xcode,我真的很困惑我今天的经历。我在计算牢房的高度 代码如下: float height = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(300 - width - 20.0, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap].height; 现在的问题是,当我将…systemFontOfSize:17.0f更改为…systemFo

我真的很困惑我今天的经历。我在计算牢房的高度

代码如下:

float height = [text sizeWithFont:[UIFont systemFontOfSize:17.0f] constrainedToSize:CGSizeMake(300 - width - 20.0, CGFLOAT_MAX) lineBreakMode:UILineBreakModeWordWrap].height;
现在的问题是,当我将…systemFontOfSize:17.0f更改为…systemFontOfSize:17.0时,如果没有“f”,它将计算错误的高度


我的问题更多的是关于这个“f”代表什么以及它的作用

f后缀只是告诉编译器哪个是浮点,哪个是双精度。如果没有“f”,所有计算都将达到双精度

1.0f浮子


1.0 double

f后缀只是告诉编译器哪个是浮点,哪个是双精度。如果没有“f”,所有计算都将达到双精度

1.0f浮子


1.0双精度

它告诉计算机这是一个浮点数。如果数字后面没有f,则将其视为双精度或整数(取决于是否有小数点)


它告诉计算机这是一个浮点数。如果数字后面没有f,则将其视为双精度或整数(取决于是否有小数点)


这真的很奇怪,因为根据定义,C在堆栈上将浮点传递为double,并且由于ObjC方法被转换为C函数,即使使用float参数,浮点也被扩展为double。尽管如此,编译器可能将17.0放入一个浮点,然后将其扩展为一个double,不知何故,iOS正在查看这个精确的二进制数(比较它),而如果直接传递double,它会略有不同,最终成为一个分数字体

所以我很好奇,决定尝试一个测试:

- (void)test:(float)foo
{
    union {
        float f;
        uint32_t u;
    } u;

    u.f = foo;
    NSLog(@"foo=%.15f hex=%x", u.f, u.u);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self test:17.0];
    [self test:17.0f];
输出:

2012-09-13 16:02:34.035 Searcher[73472:f803] foo=17.000000000000000 hex=41880000
2012-09-13 16:02:34.036 Searcher[73472:f803] foo=17.000000000000000 hex=41880000

数字和十六进制完全一样。代码中的其他地方显然有问题。

这真的很奇怪,因为根据定义,C将浮点作为堆栈上的双精度传递,并且由于ObjC方法被转换为C函数,即使使用浮点参数,浮点也被扩展为双精度。尽管如此,编译器可能将17.0放入一个浮点,然后将其扩展为一个double,不知何故,iOS正在查看这个精确的二进制数(比较它),而如果直接传递double,它会略有不同,最终成为一个分数字体

所以我很好奇,决定尝试一个测试:

- (void)test:(float)foo
{
    union {
        float f;
        uint32_t u;
    } u;

    u.f = foo;
    NSLog(@"foo=%.15f hex=%x", u.f, u.u);
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    [self test:17.0];
    [self test:17.0f];
输出:

2012-09-13 16:02:34.035 Searcher[73472:f803] foo=17.000000000000000 hex=41880000
2012-09-13 16:02:34.036 Searcher[73472:f803] foo=17.000000000000000 hex=41880000

数字和十六进制完全一样。代码中的其他地方显然有问题。

因为Objective-C来自C/C++你会找到答案()因为Objective-C来自C/C++你会找到答案()