2012-05-15 3 views
0

У меня есть этот сегмент кода:Это переполнение?

struct timeval start, end; 
gettimeofday(&start, NULL); 
//code I'm timing 
gettimeofday(&end, NULL); 
long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec); 
ofstream timeFile; 
timeFile.open ("timingSheet.txt"); 
timeFile << fixed << showpoint; 
timeFile << setprecision(2); 
timeFile << "Duration: " << elapsed << "\n"; 
timeFile.close(); 

Какой будет выводить количество микросекунд, прошедшее. Однако, если я изменю эту строку

long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec); 

к этому:

long elapsed = ((end.tv_sec-start.tv_sec)*1000000 + end.tv_usec-start.tv_usec)/1000000.0; 

я получаю отрицательное значение. Почему это происходит?

+0

Можете ли вы пометить этот вопрос с языком, используемым? – bdukes

+0

Похож на C++, но исправьте меня, если я ошибаюсь. – mc10

+0

Каковы значения 'end' и' start', которые вызывают отрицательное значение? –

ответ

1

Вы делитесь на двойной: 1000000.0 и возвращаете обратно в целочисленный тип.

Предполагая, что все начальные и конечные переменные являются ints (или longs), происходит неловкое литье в двойное, а затем обратно в длинное.

Try:

double elapsed = (double)(end.tv_sec-start.tv_sec) + (double)(end.tv_usec-start.tv)/1000000.0; 
+0

OP подразумевает, что первая форма (без деления) не дает отрицательного значения, но вторая форма делает ... –

+0

Вторая форма будет иметь результат как тип данных 'double'; но он хранит его в переменной 'long'. Поскольку он не бросает C++, это воспринимается так, как будто данные в результате явно являются данными в 'elapsed', правильно? Таким образом, он, вероятно, получит странный номер. –

+0

'long x = (blah/1000000.0)' такой же, как 'long x = (long) (blah/1000000.0)'. –

1

Я использую класс синхронизации, который я позаимствовал из где-то здесь на SO.

#include <time.h> 
#include <sys/time.h> 
#include <iomanip> 
#include <iostream> 

using namespace std; 

class Timer 
{ 
private: 

timeval startTime; 

public: 

    void start() 
    { 
    gettimeofday(&startTime, NULL); 
    } 

    double stop() 
    { 
    timeval endTime; 
    long seconds, useconds; 
    double duration; 

    gettimeofday(&endTime, NULL); 

    seconds = endTime.tv_sec - startTime.tv_sec; 
    useconds = endTime.tv_usec - startTime.tv_usec; 

    duration = seconds + useconds/1000000.0; 

    return duration; 
    } 

    static void printTime(double duration) 
    { 
    cout << setprecision(6) << fixed << duration << " seconds" << endl; 
    } 
}; 

Например:

Timer timer = Timer(); 
timer.start(); 
long x=0; 
for (int i = 0; i < 256; i++) 
    for (int j = 0; j < 256; j++) 
    for (int k = 0; k < 256; k++) 
     for (int l = 0; l < 256; l++) 
     x++; 
timer.printTime(timer.stop()); 

дает 11.346621 seconds.

Для моего hash function project, я получаю:

Number of collisions: 0 
Set size: 16777216 
VM: 841.797MB 
22.5810500000 seconds 
+0

Я знаю, что это не отвечает на вопрос, но это обеспечивает работу вокруг проблемы. – Drise

+0

Спасибо! Это будет полезно для будущего. – Dave

+0

На самом деле это не сработало. – Dave

Смежные вопросы