2009-07-23 2 views
0

Я мог бы воспользоваться помощью. После нескольких разочаровывающих дней проб и ошибок, я получаю непоследовательные результаты, записывающие предпочтения в NSUserDefaults.iPhone SDK NSUserDefaults не сохраняет правильные значения

Вот последовательные строки кода:

 NSLog(@"startTimer(): End Time defaults: %f\n", [defaults floatForKey:kEndTimeKey]); 
    NSLog(@"startTimer(): new End Time: %f\n", endTime); 
    [defaults setFloat:endTime forKey:kEndTimeKey]; 
    [defaults synchronize]; 
    NSLog(@"startTimer(): stored EndTimeKey: %f\n", [defaults floatForKey:kEndTimeKey]); 

kEndTimeKey постоянная строка.

Как вы можете видеть, я регистрирую текущее значение для ключа, затем регистрирую значение, которое я намерен хранить, синхронизировать, а затем перечитывать сохраненное значение. Кажется, просто мне, но вот выход отладчик:

2009-07-22 22:05:43.263 TimerTest3[1584:207] startTimer(): End Time defaults: 0.000000 
2009-07-22 22:05:43.266 TimerTest3[1584:207] startTimer(): new End Time: 270018630.916571 
2009-07-22 22:05:43.287 TimerTest3[1584:207] startTimer(): stored EndTimeKey: 270018624.000000 

Я вижу исходное значение 0, предполагаемое значение, оканчивающимся на 571, и значение, считанное из кэша, который 6 секунд выключен.

Я не уверен, откуда появился новый дефолт. Есть идеи? Я получаю подобное поведение на устройстве и на симуляторе.

Благодаря Брэд

ответ

1

Как вы настройки Конечное время. Это двойник? Я относительно уверен, что это не проблема NSUserDefaults, а математическая проблема с плавающей запятой.

270018630.916571 - это 16 десятичных цифр, которые занимают более 48 бит данных для хранения мантиссы. Плавающая точка - 32 бита, но 1 бит - знаковый бит, 8 бит экспоненты и 23 бита мантиссы. Это означает, что значение, которое вы видите, больше, чем может содержать float, и ожидается некоторая потеря точности. Даже если вы усекаете его до 270018630, который все еще занимает ~ 28 бит percision, чтобы выразить, что означает, что он должен быть округлен с шагом больше целого числа.

Номера с плавающей запятой не позволяют вам магически выражать большие числа, чем int с одинаковым количеством бит. Они создают способность хранить большие числа, изменяя разрыв между числами и используя метаданные (экспонента) для отслеживания. У Википедии есть достойный explanation, как они работают.

+0

Я считаю, что вы правы. Я пытался хранить NSTimeIntervals, которые определены как двойные. Это объясняет, почему в некоторых случаях функциональность была близка, непоследовательная в других, и прекрасная для небольших чисел. – 2009-07-23 14:03:27

 Смежные вопросы

  • Нет связанных вопросов^_^