(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
所以我怀疑这个bug是在lldb
的可变参数功能的处理。
您可以在打开的bug报告的LLVM的Bugzilla在和/或苹果的bug记者(又名rdar) 。