2014-08-28 1 views
0

아무도 내가 아래 줄에 두 번 놓칠 경우 어떻게 될지 말해 줄 수 있습니까?c 프로그램의 계산 실행 시간에 오류가 있습니까?

time_spent = (double)(end - begin)/CLOCKS_PER_SEC; 

내 정렬 문제의 실행 시간을 계산하려했는데 이중으로 형변환하는 것을 잊어 버렸습니다. 코드는 거의 90 분 동안 실행되었지만 인쇄 된 출력 시간은 "270.000006"입니다. 누구든지 270이 의미하는 바를 알아내는 데 나를 도울 수 있습니까 ??

때때로 "-ve"값을 표시합니다. 이 문제에 대한 해결책.

EDIT - 10^9 및 10^10 개의 숫자를 정렬하므로 코드가 몇 시간 동안 실행됩니다.

+0

어떻게 끝과 시작 값을 얻고 그 유형은 무엇입니까? –

+0

나는 아래에 언급 된 Debasish와 같은 코드를 사용했다. – Anurag

답변

5

거의 90 분 동안 코드를 실행하면 72 분 이내에 32 비트 아키텍처에서 clock_t 유형이 오버플로됩니다. 나는 이것이 당신의 경우라고 생각합니다.

+0

어쨌든이 오버플로를 피하기 위해 있습니까? – Anurag

+0

@Anurag 실행 단계에서 이미 완료했는데, 얼마나 많이 오버플로했는지 파악한 다음 (그 값이 "한 번 넘침"이라고 생각하면), 그 값 + 최대 값이라고 가정합니다. 미래의 문제를 해결하려면 물론 결과에 맞는 변수에 저장해야합니다. – Jite

+0

@Jite. 오래 두 번 작동 괜찮습니까 ?? – Anurag

0

올바른 사용법은 : 당신은 여기뿐만 아니라 I/O 시간을 포함 경과 시간을 CPU 시간을하지 측정하는

clock_t begin, end; 
    double time_spent; 

    begin = clock(); 
    /* actual task that needs to be monitored */ 
    end = clock(); 
    time_spent = (double)(end - begin)/CLOCKS_PER_SEC; // in seconds 

. CLOCKS_PER_SEC는에서 선언 된 상수입니다. 계산은 부동 소수점 산술로 수행되어야합니다. 타이밍을 계산하는 또 다른 방법은 time 명령을 사용하는 것입니다.

읽기 How to log the time taken for a unix command?

+0

그는 그것이 그가 요구 한 것이 아니라는 것을 알고 있습니다. 그는 ** ** 저장/두 배로의 형 변환을하지 않으면 어떻게되는지 물었다. – Jite

+0

두 배로 캐스팅하지 않으면 정수 산술로 인해 정밀도가 떨어집니다. –

+0

예 또는 악화되면 오버플로가 발생하며 이는 그의 질문에 대한 답과 같습니다. – Jite