Странное поведение с stringWithFormat float

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

Кто-нибудь понимает поведение здесь? Я работаю на устройстве.


person xster    schedule 07.07.2012    source источник


Ответы (1)


Это ошибка в lldb. Если вы попробуете то же самое в gdb, все будет работать правильно. Я подозреваю, что lldb передает только младшие 32 бита аргумента. Представление IEEE 0.01 и числа, которое он печатает, таково:

47ae147b3778df69 = 19991592471028323832250853378750414848.00
3f847ae147ae147b = 0.01

Обратите внимание, что младшие 32 бита 0,01 совпадают со старшими 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 и/или на Отчет об ошибках Apple (он же rdar).

person rob mayoff    schedule 07.07.2012