Почему разница между двумя time_t
возвращается методом difftime( time_t t1, time_t t2)
как double
? Я не понимаю, откуда берется требование точности.
Представляя разницу между time_t
Ответы (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 (индикатор "не знаю") с соответствующим преобразованием.Однако никакие арифметические свойства этих типов не определены Стандартом, чтобы обеспечить максимальную гибкость реализации при выборе диапазонов, точности и представлений, наиболее подходящих для их предполагаемого применения. Представление не обязательно должно быть подсчетом какой-то базовой единицы; реализация могла бы представить различные компоненты временного значения как подполя целочисленного типа.
Несмотря на то, что его повсеместно считают — и реализуют — как целочисленный тип, представляющий секунды с начала некоторой эпохи, time_t
на самом деле формально не определяется как таковой, поэтому вы не могли бы переносимо использовать результат difftime, если бы это был time_t
. Что касается других альтернатив: int
в некоторых случаях слишком мал (как и long
), а long long
не переносим.
Вероятно, потому, что это самый общий арифметический тип. И это обеспечивает точность выше второй, если ее поддерживает базовый time_t
.
Причина этого в том, что для типа time_t
не определены арифметические операции, возврат двойного значения означает, что вы можете использовать результат в вычислениях.
IOW, если вы добавите два значения time_t
друг к другу, вы окажетесь на небезопасной территории, поскольку может возникнуть другое поведение, если time_t определено как беззнаковое целое число или обычное целое число - в зависимости от вашей платформы.