2010-12-16 8 views
4

코드를입니다여기에있는 NSDate 및 배정 밀도 문제

NSDate* d = [NSDate dateWithTimeIntervalSince1970:32.4560]; 
double ti = [d timeIntervalSince1970]; 
NSLog(@"Interval: %f %f %f %f",ti,32.4560,ti*1000.0,32.4560*1000.0); 

출력이

간격 : 32.456000 32.456000 32455.999970 32456.000000

왜 어떤 정밀도를 잃을 값을 반환있는 NSDate?

답변

7

그 자체는 NSDate의 문제가 아닙니다. 부동 소수점 숫자 자체의 특성입니다. 나는 NSDate이 UNIX epoch (1970)가 아니라 OS X epoch (2001)에서 날짜를 유지한다고 믿습니다. 두 신기원의 차이를 x라고합시다.

NSDate* d = [NSDate dateWithTimeIntervalSince1970:32.4560]; 
// at this point, d keeps 32.4560 + x 
double ti = [d timeIntervalSince1970]; 
// ti is then (32.4560+x)-x 

그러나, 부동 소수점 무한 정밀도를 가지고 있지 않습니다

그런 다음 무슨 일이 있습니다. 따라서 +x을 입력 한 다음 -x을 입력하면 계산에 약간의 오차가 생길 수 있습니다.

자세한 내용은 다음을 참조하십시오. 당신이 OS X의 신기원을 사용하는 경우 this Wikipedia article.

, 당신은 당신이 순진하게 기대하는 것을 얻을 :

NSDate* d = [NSDate dateWithTimeIntervalSinceReferenceDate:32.4560]; 
// at this point, d keeps 32.4560 + 0 
double ti = [d timeIntervalSinceReferenceDate]; 
// ti is then (32.4560+0)-0, which is 32.4560 even in the floating point world. 
+0

감사합니다, 나는 OSX의 시대를 몰랐다 2001 – teerapap

+0

어쩌면 내가 사용 했어야 용어 "오픈 스텝의 시대입니다 "대신. http://docs.sun.com/app/docs/doc/802-2112/6i63mn64s?l=en&a=view#05.Classes-81 OpenStep 사양은 2001 년 이전에 출시 된 것으로 믿습니다. 향후 참조 날짜. – Yuji