Как напечатать переменную time_t как число с плавающей запятой? - PullRequest
3 голосов
/ 13 апреля 2010

Я использую переменную time_t в C (среда openMP), чтобы сохранить время выполнения процессора ... Я определяю значение с плавающей точкой sum_tot_time для суммирования времени для всех процессоров ... Я имею в виду sum_tot_time - сумму значений time_t процессора Проблема в том, что при выводе значения sum_tot_time оно представляется как целое или длинное, кстати, без его десятичной части!

Я пробовал так:

  1. , чтобы printf sum_tot_time как double был двойным значением
  2. в printf sum_tot_time как значение с плавающей точкой, являющееся значением с плавающей точкой
  3. , чтобы printf sum_tot_time удвоился, будучи значением time_t
  4. для вывода значения sum_tot_time с плавающей точкой, являющегося значением time_t

Ответы [ 2 ]

3 голосов
/ 13 апреля 2010

Разрешение time_t составляет максимум одну секунду на большинстве платформ. То есть на большинстве платформ time_t будет целочисленным (32- или 64-разрядным) значением, подсчитывающим количество секунд, прошедших с полуночи 1 января 1970 года (UTC), и может достичь только одного второе разрешение.

Следовательно, сумма значений time_t также будет отображать разрешение только в одну секунду (без десятичной части, даже после преобразования в double.)

Выше было сказано, какой нативный вызов или вызов OpenMP вы используете для получения значений time_t, которые вы пытаетесь накапливать?

Если используется собственный вызов * nix getrusage() для заполнения структуры rusage (при условии, что ваша платформа поддерживает ее) со временем пользователя / ядра или с использованием gettimeofday() , чтобы получить время на стене, затем используйте оба поля tv_sec и tv_usec, равные struct timeval, чтобы сгенерировать значение double (обычно с разрешением в миллисекундах или лучше) и использовать его вместо time_t в ваших расчетах:

struct timeval {
        time_t          tv_sec;         /* seconds */
        suseconds_t     tv_usec;        /* microseconds */
};

Соответственно, вы можете использовать GetThreadTimes / GetProcessTimes для времени пользователя / ядра или _ftime для настенного времени на платформах Windows, затем объединить FILETIME::dwHighDateTime/dwLowDateTime.

0 голосов
/ 13 апреля 2010

Я не уверен, есть ли у вас доступ к стандартным системным вызовам * nix (или это имеет отношение конкретно к тому, что вы делаете), но если вы это сделаете, вы можете использовать timeval struct и gettimeofday. Например, чтобы распечатать временную метку с шестью десятичными разрядами точности, которая производит временную метку в стиле tcpdump ( предоставлено Стивеном UNP )

#include    "unp.h"
#include    <time.h>

char *
gf_time(void)
{
    struct timeval  tv;
    time_t          t;
    static char     str[30];
    char            *ptr;

    if (gettimeofday(&tv, NULL) < 0)
        err_sys("gettimeofday error");

    t = tv.tv_sec;  /* POSIX says tv.tv_sec is time_t; some BSDs don't agree. */
    ptr = ctime(&t);
    strcpy(str, &ptr[11]);
        /* Fri Sep 13 00:00:00 1986\n\0 */
        /* 0123456789012345678901234 5  */
    snprintf(str+8, sizeof(str)-8, ".%06ld", tv.tv_usec);

    return(str);
}
...