2012-07-07 2 views
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 

여기 행동을 이해하는 사람이 있습니까? 나는 장치에서 달리고있다.stringWithFormat float로 이상한 동작

답변

4

이것은 lldb의 버그입니다. gdb에서 같은 것을 시도하면 제대로 작동합니다. 나는 lldb이 인수의 하위 32 비트만을 전달하고 있다고 생각합니다. 0.01하고있어 인쇄 수의 IEEE 표현이있다 :

47ae147b3778df69 = 19991592471028323832250853378750414848.00 
3f847ae147ae147b = 0.01 

통지하는 매치 0.01의 낮은 32 비트의 다른 수의 상위 32 비트.

버그는 printf으로 발생 : 그것은 +[NSNumber numberWithDouble:]으로 발생하지 않습니다

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

:

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

그래서 나는 버그가 가변 기능 lldb의 처리에있다 생각한다.

the LLVM bugzilla 및/또는 Apple's bug reporter (aka rdar)에서 버그 보고서를 열 수 있습니다.

+0

이 버그는 Xcode 4.4에서 수정되었습니다. –