【发布时间】:2012-03-31 22:05:48
【问题描述】:
为什么difftime( time_t t1, time_t t2) 方法返回的两个time_ts 之间的区别是double?我看不出精度要求从何而来。
【问题讨论】:
为什么difftime( time_t t1, time_t t2) 方法返回的两个time_ts 之间的区别是double?我看不出精度要求从何而来。
【问题讨论】:
因为time_t 在标准中被简单地定义为arithmetic type capable of representing times。
这就是它所说的全部内容。它不必是整数,也不必代表秒。它只能是 10 的倍数,或者它可能是能够表示时间的浮点类型,分辨率低至 10-43 秒。
C99 7.23.1 Components of time 的引述是(稍微转述):
声明的类型是
clock_t和time_t,它们是能够表示时间的算术类型。 clock_t 和 time_t 中可表示的时间范围和精度是实现定义的。
因此盲目计算时差的人:
delta = time_end - time_begin;
可能会发现他们的代码并不适用于所有平台。
现在,我不知道任何平台自纪元以来都不是简单的几秒钟,但我之前曾被这样的假设所困扰,例如假设@987654328 @ 到 Z 是连续的,而事实上,这不是必需的,并且在使用 EBCDIC 的大型机产品上效果不佳。而且,是的,尽管自 60 年代以来它们显然已经死亡,但它们在 大量 的使用中仍然是 still :-)
C99 基本原理文档有这样的说法:
clock_t和time_t类型是算术类型,因为根据现有实践,这些类型的值有时必须与 -1(“不知道”指示)进行比较,并适当地转换。但是,标准没有定义这些类型的算术属性,以便实现在选择最适合其预期应用的范围、精度和表示方面具有最大的灵活性。表示不必是某个基本单位的计数;可以想象,一个实现可以将时间值的不同组件表示为整数类型的子字段。
【讨论】:
尽管被普遍认为 - 并实现 - 作为一个整数类型,表示自某个纪元开始以来的秒数,time_t 实际上并没有正式定义为这样,所以如果它,你不能便携地使用 difftime 的结果是time_t。至于其他替代方案:int 在某些情况下太小(long 也是如此),long long 不可移植。
【讨论】:
可能是因为它是最通用的算术类型。如果底层 time_t 支持它,它允许优于秒精度。
【讨论】:
原因是没有为 time_t 类型定义算术运算,通过返回一个双精度值意味着您可以在计算中使用结果。
IOW 如果您将两个 time_t 值彼此相加,则您处于不安全区域,因为如果 time_t 定义为 unsigned int 或普通 int 可能会导致不同的行为 - 取决于您的平台。
【讨论】: