Представляя разницу между time_t - PullRequest
1 голос
/ 15 марта 2012

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

Ответы [ 4 ]

2 голосов
/ 15 марта 2012

Поскольку 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 (индикация «не знаю»)), соответствующим образом приведенный.

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

1 голос
/ 15 марта 2012

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

1 голос
/ 15 марта 2012

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

0 голосов
/ 15 марта 2012

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

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

...