3
(lldb) po [NSString stringWithFormat:@"%.1f", 0.01]
(id) $21 = 0x003a2560 19991592471028323832250853378750414848.0
(lldb) po [NSString stringWithFormat:@"%.1f", 0.1]
(id) $22 = 0x0de92240 -0.0

誰かがここでの動作を理解していますか?デバイスで実行しています。

4

1 に答える 1

4

のバグですlldb。で同じことを試すと、gdb正常に動作します。lldb引数の下位32ビットのみを渡していると思われます。0.01 の IEEE 表現とそれが出力する数値は次のとおりです。

47ae147b3778df69 = 19991592471028323832250853378750414848.00
3f847ae147ae147b = 0.01

0.01 の下位 32 ビットが他の数値の上位 32 ビットと一致することに注意してください。

バグは次の場合にも発生しprintfます。

(lldb) expr (void)printf("%.1f\n", 0.01)
19991592257096858016910903319197646848.0
<no result>

では起こりません+[NSNumber numberWithDouble:]

(lldb) po [NSNumber numberWithDouble:0.01]
(id) $3 = 0x0fe81390 0.01

したがって、バグはlldbの可変引数関数の処理にあると思われます。

LLVM bugzillaおよび/またはApple のバグ レポーター (別名 rdar)でバグ レポートを開くことができます。

于 2012-07-07T04:40:59.873 に答える