2013-04-17 2 views
0

gettimeofday() 함수를 사용하여 함수 시간을 측정하려고합니다. 마이크로 초 단위로 시간을 얻을 수 있지만 long으로 시간을 초 단위로 나누려고 할 때 내 값이 단일 integer으로 잘립니다. 왜 이런 일이 일어나는 지에 대한 통찰력이 있습니까? long = 1000000.0으로 나누면이 종류의 잘림을 방지 할 수 있다고 생각했습니다. 기능의오랫동안 잘리지 않음 - C

타이밍 :

struct timeval t1,t2; 

gettimeofday(&t1, NULL); 

// Computes C - C1 - using single thread 
for (i=0; i < n; i++) 
    for (j=0; j < p; j++) 
    { 
     C1[i][j]=0; 
     for (k=0; k < m; k++) 
      C1[i][j] += A[i][k]*B[k][j]; 
    } 

gettimeofday(&t2, NULL); 

부문이 여기에 적용 : 어떤 도움에 감사드립니다

long divider = 1000000.0; 
long elapsed = ((t2.tv_sec - t1.tv_sec) * 1000000.0L) + (t2.tv_usec - t1.tv_usec); 
elapsed = (elapsed/divider); 

printf("Time in seconds: %ld seconds\n", elapsed); 

.

+1

왜 두 번 사용하지 않습니까? long은 정수 유형입니다. – rerun

+1

'long '은 정수형이라는 것을 알고 계십니까? –

+0

아, 사과드립니다. double을 사용하여 테스트했지만 printf의 형식 코드는 변경하지 않았습니다. 도와 주셔서 감사합니다. –

답변

3

Long는 당신은 아마 dividerelapsed에 대한 double를 사용하려면, 소수를 보유하지 않습니다 의미 정수 유형입니다. cplusplus.com에 대한 자세한 내용

또한 %lf ~ printf 값이 필요합니다.

보정 : 그냥 %f 등의 printf 포맷은 long 유형은 정수 타입 분명히 enough

2

입니다.

문제는 float (또는 double)이되도록 결과를 long에 저장하려고하는 것입니다.

여기에 두 가지 문제가 있습니다 1 귀하의 피연산자 (컴파일러에 의해 암시 적 캐스트) float/double에 던져되지 않습니다, 그래서 모든 중간 작업이 int 또는 long 반환합니다. 2- 결과는 long입니다. 피연산자가 float/double 인 경우에도 결과는 long으로 변환됩니다.

해야 할 일 : double 변수를 사용하십시오.

double divider = 1000000.0; 
double elapsed = ((t2.tv_sec - t1.tv_sec) * 1000000.0) + (t2.tv_usec - t1.tv_usec); 
elapsed = (elapsed/divider); 

printf("Time in seconds: %5.5f seconds\n", elapsed); 
관련 문제