0

今日経験したことについて、私は本当に混乱しました。セルの高さを計算していました。

これはコードです:

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」が何を表し、何をするかについてです。

4

3 に答える 3

2

これが浮動小数点数であることをコンピュータに伝えます。数値の後に f がない場合、倍精度または整数と見なされます (小数点があるかどうかによって異なります)。

20.0f -> float
20.0 -> double
20 -> integer
于 2012-09-13T20:02:45.303 に答える
2

これは本当に奇妙です。なぜなら、C は float を double としてスタックに渡します。ObjC メソッドは C 関数に変換されるため、float パラメーターを使用しても float は double に拡張されます。そうは言っても、コンパイラが17.0をfloatに入れ、それをdoubleに拡張している可能性があります.iOSはその正確な2進数を調べています(比較しています)が、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

数字はまったく同じで、ヘックスと同じでした。コードのどこかで何かが明らかに間違っています。

于 2012-09-13T20:04:25.980 に答える
1

f サフィックスは、どちらが float でどちらが double であるかをコンパイラに伝えるだけです。'f' を指定しないと、すべての計算が double の精度になります。

1.0f フロート

1.0 ダブル

于 2012-09-13T19:52:44.770 に答える