Представляя разницу между time_t

Почему разница между двумя time_t возвращается методом difftime( time_t t1, time_t t2) как double? Я не понимаю, откуда берется требование точности.


person Konrad    schedule 15.03.2012    source источник


Ответы (4)


Поскольку time_t просто определяется в стандарте как arithmetic type capable of representing times.

Вот и все, что об этом говорится. Это не обязательно должно быть целое число, оно не должно представлять секунды. Он может быть только кратным десяти или может быть типом с плавающей запятой, способным представлять время с разрешением до 10-43 секунд.

Цитата из C99 7.23.1 Components of time (слегка перефразированная):

Объявлены типы clock_t и time_t, которые являются арифметическими типами, способными представлять время. Диапазон и точность времен, представляемых в clock_t и time_t, определяются реализацией.

Отсюда люди, которые вслепую отрабатывают разницу во времени с помощью:

delta = time_end - time_begin;

может обнаружить, что их код работает не на всех платформах.

Теперь я не знаю навскидку какие-либо платформы, на которых это не простые секунды с начала эпохи, но я был укушен предположениями, такими раньше, такими как предположение, что A через Z являются смежными. тогда как на самом деле это не требуется и не работает так хорошо на продуктах для мэйнфреймов, которые используют EBCDIC. И да, они все еще в тяжелых использовать, несмотря на то, что он, по-видимому, умирал с 60-х годов :-)

В обосновании C99 говорится следующее:

Типы clock_t и time_t являются арифметическими, поскольку значения этих типов должны, в соответствии с существующей практикой, время от времени сравниваться с -1 (индикатор "не знаю") с соответствующим преобразованием.

Однако никакие арифметические свойства этих типов не определены Стандартом, чтобы обеспечить максимальную гибкость реализации при выборе диапазонов, точности и представлений, наиболее подходящих для их предполагаемого применения. Представление не обязательно должно быть подсчетом какой-то базовой единицы; реализация могла бы представить различные компоненты временного значения как подполя целочисленного типа.

person paxdiablo    schedule 15.03.2012
comment
Технически вы правы насчет переносимости, но знаете ли вы какие-нибудь платформы, на которых time_t не работает так, как привыкло большинство? - person John Zwinck; 15.03.2012
comment
@John, не сразу пришло мне в голову (см. обновление), но я все же предпочел бы код для переносимости, насколько это практически возможно. - person paxdiablo; 15.03.2012
comment
Я за мобильность - мне просто любопытно. - person John Zwinck; 16.03.2012

Несмотря на то, что его повсеместно считают — и реализуют — как целочисленный тип, представляющий секунды с начала некоторой эпохи, time_t на самом деле формально не определяется как таковой, поэтому вы не могли бы переносимо использовать результат difftime, если бы это был time_t. Что касается других альтернатив: int в некоторых случаях слишком мал (как и long), а long long не переносим.

person Marcelo Cantos    schedule 15.03.2012

Вероятно, потому, что это самый общий арифметический тип. И это обеспечивает точность выше второй, если ее поддерживает базовый time_t.

person James Kanze    schedule 15.03.2012

Причина этого в том, что для типа time_t не определены арифметические операции, возврат двойного значения означает, что вы можете использовать результат в вычислениях.

IOW, если вы добавите два значения time_t друг к другу, вы окажетесь на небезопасной территории, поскольку может возникнуть другое поведение, если time_t определено как беззнаковое целое число или обычное целое число - в зависимости от вашей платформы.

person AndersK    schedule 15.03.2012