2009-07-23 5 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

어떻게 endTime- 사용자 설정된다. 이중입니까? 나는 상대적으로 이것이 NSUserDefaults 문제가 아니라 부동 소수점 수학 문제라는 것을 확신한다.

270018630.916571은 16 진수로, 가수를 저장하기 위해 ~ 48 비트의 데이터를 사용합니다. 부동 소수점은 32 비트이지만 그 중 1 비트는 부호 비트, 8 비트의 지수 및 23 비트의 가수입니다. 즉,보고있는 값이 부동 소수점이 유지할 수있는 값보다 훨씬 크기 때문에 손실 된 정밀도가 어느 정도 예상됩니다. 270018630으로 자르더라도 약 28 비트의 퍼시션을 표현할 수 있습니다. 즉, 정수보다 큰 단위로 반올림되어야합니다.

부동 소수점 수를 사용하면 같은 비트 수를 가진 int보다 큰 수를 마술처럼 표현할 수 없습니다. 숫자 사이의 간격을 변경하고 메타 데이터 (지수)를 사용하여 큰 숫자를 저장하는 기능을 만듭니다. Wikipedia는 그들이 어떻게 작동하는지 알맞은 explanation을 가지고 있습니다.

+0

나는 당신이 옳다고 믿습니다. 나는 double 형으로 정의 된 NSTimeIntervals를 저장하려고했습니다. 이는 기능이 어떤 경우에는 가까이 있고, 다른 곳에서는 일관성이 없었던 이유와 작은 수의 경우에 대해 잘 설명합니다. –

관련 문제