2017-11-06 8 views
-1

대답은 간단하지만 확실하지 않습니다.C가 길면 뺄셈이 정확하지 않습니까?

struct timespec start, finish, diff; 
int ndiff; 

/* Structs are filled somewhere else */ 

diff.tv_sec = finish.tv_sec - start.tv_sec; 
ndiff = finish.tv_nsec - start.tv_nsec; 
if (ndiff < 0) { 
    diff.tv_sec--; 
    ndiff = 1L - ndiff; 
} 
diff.tv_nsec = ndiff; 

printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec); 

그러나 출력 내가 그 이후 (나노초의 마지막 세 자리를 잃고 있음을 나타내는 것으로 보인다 Elapsed time: 0.300876000 seconds. 같은 것이 항상 :이 코드를 사용하여 두 struct timespec 사이에 델타를 계산하기 위해 노력하고있어 항상 0이 아니어야 함). 누군가 그 원인을 지적 할 수 있습니까?

+3

timespec이 나노 초 정확한 것으로 보장 할 수는 없습니다. – rici

+4

'ndiff = 1L - ndiff;'는 나에게 잘못 보입니다. –

+0

... 아니면'struct timespec '을 채울 수있는 시스템 인터페이스가 나노초 해상도를 보장하지 않는다고 말하는 것이 더 정확할 수도 있습니다. –

답변

2

경과 시간 : 0.300876000 초. 이것은 나노초의 마지막 3 자리를 잃어 버리고 있음을 나타내는 것으로 보인다. (항상 0이 아니어야하기 때문이다.) 누군가 그 원인을 지적 할 수 있습니까?

코드의 시계는 1000 ns로보고했습니다.

diff.tv_sec@John Bollinger@rici

및/또는 반드시 long 없습니다. 일치하는 지정자를 사용하십시오.

또한
// printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec); 
// Also insure fraction is printed with 9 digits 
printf("Elapsed time: %lld.%09ld seconds.\n", (long long) diff.tv_sec, diff.tv_nsec); 

잘못 "빌려"수학 ndiff를 업데이트.

더 나은 경우에는 int diff 변수를 삭제하십시오.

diff.tv_sec = finish.tv_sec - start.tv_sec; 
diff.tv_nsec = finish.tv_nsec - start.tv_nsec; 
if (diff.tv_nsec < 0) { 
    diff.tv_sec--; 
    diff.tv_nsec += 1000000000; 
} 

finishstart하기 전에, 다음, 다른 코드가 동일한 기호 diff의 두 멤버를 유지하는 것이 바람직 할 수있다 발생합니다.

+0

동일한 결과가 나타납니다. – user8793