(lldb) po [NSString stringWithFormat:@"%.1f", 0.01]
(id) $21 = 0x003a2560 19991592471028323832250853378750414848.0
(lldb) po [NSString stringWithFormat:@"%.1f", 0.1]
(id) $22 = 0x0de92240 -0.0
誰かがここでの動作を理解していますか?デバイスで実行しています。
(lldb) po [NSString stringWithFormat:@"%.1f", 0.01]
(id) $21 = 0x003a2560 19991592471028323832250853378750414848.0
(lldb) po [NSString stringWithFormat:@"%.1f", 0.1]
(id) $22 = 0x0de92240 -0.0
誰かがここでの動作を理解していますか?デバイスで実行しています。
のバグです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)でバグ レポートを開くことができます。