Cir*_*四事件 27
似乎没有完美的方式.问题的根源clock_t可以是整数或浮点.
clock_t可以是浮点类型
正如BastienLéonard 提到的POSIX(向上投票),C99 N1256草案 7.23.1/3也说:
[clock_t]是能够表示时间的算术类型
和6.2.5/18:
整数和浮点类型统称为算术类型.
并且标准将算术类型定义为整数或浮点类型.
如果您将除以CLOCKS_PER_SEC,请使用long double
返回值clock()是实现定义的,获取标准含义的唯一方法是除以CLOCKS_PER_SEC查找秒数:
clock_t t0 = clock();
/* Work. */
clock_t t1 = clock();
printf("%Lf", (long double)(t1 - t0));
Run Code Online (Sandbox Code Playgroud)
由于以下两个原因,这已经足够好了,虽然不是很完美:
似乎没有intmax_t浮点类型的模拟:如何获得最大的精度浮点数据类型的实现及其printf说明符?因此,如果明天出现更大的浮点类型,则可以使用它并破坏您的实现.
如果clock_t是一个整数,则将float定义为使用最近的float.您可能会失去精度,但与绝对值相比并不重要,并且只会long int在很长一段时间内发生,例如在x86中是具有64位有效的80位浮点数,这是几百万年的秒数.
如果说类似的东西,那就去投票.
如果您认为它是一个整数,请使用%ju和uintmax_t
虽然unsigned long long目前是最大的标准整数类型:
clock_t可能是其中之一因此最好将类型转换为可能的最大无符号整数类型:
#include <stdint.h>
printf("%ju", (uintmax_t)(clock_t)1);
Run Code Online (Sandbox Code Playgroud)
uintmax_t 保证在机器上具有最大可能的整数大小.
uintmax_t并且它的printf说明符%ju是在c99和gcc中引入的,例如实现它们.
作为奖励,这一劳永逸地解决了如何可靠printf整数类型的问题(遗憾的是不一定是这种情况clock_t).
如果它是双重的话会出现什么问题:
由于这些后果比整数到浮点转换更严重,因此使用float可能是更好的主意.
在glibc 2.21上它是一个整数
手册说使用double是一个更好的主意:
在GNU/Linux和GNU/Hurd系统上,clock_t等效于long int,CLOCKS_PER_SEC是整数值.但在其他系统中,clock_t和宏CLOCKS_PER_SEC都可以是整数或浮点类型.将CPU时间值转换为加倍,如上例所示,确保算术和打印等操作无论底层表示是什么都能正常且一致地工作.
在glibc 2.21中:
clock_t是long int:
__clock_t__CLOCK_T_TYPE__SLONGWORD_TYPElong intclock()在Linux中实现sys_clock_gettime:
__clock_gettimeSYSDEP_GETTIME_CPUSYSCALL_GETTIME最终进行内联系统调用man clock_gettime,告诉我们它返回struct timespecGCC中包含long int字段的内容.
因此底层实现确实返回整数.
也可以看看
Bas*_*ard 12
据我所知,你做的方式是最好的.除了clock_t可能是一个真实的类型:
time_t并且clock_t应该是整数或实数浮动类型.
http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html
lem*_*nad 11
这可能是因为时钟滴答不是一个非常明确的单位.您可以将其转换为秒并将其打印为double:
time_in_seconds = (double)time_in_clock_ticks / (double)CLOCKS_PER_SEC;
printf("%g seconds", seconds);
Run Code Online (Sandbox Code Playgroud)
CLOCKS_PER_SEC宏扩展为表示一秒钟内时钟周期数的表达式.
| 归档时间: |
|
| 查看次数: |
57424 次 |
| 最近记录: |