3 回答

TA貢獻(xiàn)1826條經(jīng)驗(yàn) 獲得超6個贊
似乎沒有完美的方法。問題的根源clock_t
可以是整數(shù)或浮點(diǎn)數(shù)。
clock_t可以是浮點(diǎn)類型
正如BastienLéonard在POSIX中提到的(贊成他),C99 N1256草案 7.23.1 / 3也說:
[clock_t是]能夠表示時間的算術(shù)類型
和6.2.5 / 18:
整數(shù)和浮點(diǎn)類型統(tǒng)稱為算術(shù)類型。
該標(biāo)準(zhǔn)將算術(shù)類型定義為整數(shù)或浮點(diǎn)類型。
如果要除以CLOCKS_PER_SEC,請使用long double
返回值clock()
是實(shí)現(xiàn)定義的,唯一獲得標(biāo)準(zhǔn)含義的方法是除以CLOCKS_PER_SEC
秒數(shù):
clock_t t0 = clock();/* Work. */clock_t t1 = clock();printf("%Lf", (long double)(t1 - t0));
由于以下兩個原因,這雖然不夠完美,但卻足夠好:
似乎沒有類似于
intmax_t
浮點(diǎn)類型的方法:如何獲得實(shí)現(xiàn)的最大精度浮點(diǎn)數(shù)據(jù)類型及其printf標(biāo)識符?因此,如果明天出現(xiàn)更大的浮點(diǎn)類型,則可以使用它并破壞您的實(shí)現(xiàn)。如果
clock_t
為整數(shù),則將float強(qiáng)制轉(zhuǎn)換為盡可能使用最近的float。您可能會失去精度,但是與絕對值相比并沒有多大關(guān)系,只會發(fā)生大量時間,例如,long int
在x86中,80位浮點(diǎn)數(shù)具有64位有效值,數(shù)百萬年以秒為單位。
如果您認(rèn)為它是整數(shù),請使用%ju和uintmax_t
盡管unsigned long long
目前是可能的最大標(biāo)準(zhǔn)整數(shù)類型:
將來可能會出現(xiàn)更大的一個
該標(biāo)準(zhǔn)已經(jīng)明確允許更大的實(shí)現(xiàn)定義類型(@FUZxxl的榮譽(yù)),并且
clock_t
可能是其中之一
因此,最好將類型轉(zhuǎn)換為最大的無符號整數(shù)類型:
#include <stdint.h>printf("%ju", (uintmax_t)(clock_t)1);
uintmax_t
確保機(jī)器上具有最大可能的整數(shù)大小。
uintmax_t
它的printf說明符%ju
在c99中引入,例如gcc實(shí)現(xiàn)了它們。
另外,這可以徹底解決如何可靠地對printf
類型進(jìn)行整數(shù)處理的問題(不幸的是,不一定是這種情況clock_t
)。
如果是雙重的話可能會出問題:
如果太大而無法容納整數(shù),不確定的行為
小于1的數(shù)字將四舍五入為0,您將看不到任何內(nèi)容
由于這些后果比整數(shù)到浮點(diǎn)數(shù)轉(zhuǎn)換要嚴(yán)重得多,因此使用浮點(diǎn)數(shù)可能是一個更好的主意。
在glibc 2.21上,它是一個整數(shù)
手冊說使用double
是一個更好的主意:
在GNU / Linux和GNU / Hurd系統(tǒng)上,clock_t等效于long int,而CLOCKS_PER_SEC是整數(shù)。但是在其他系統(tǒng)中,clock_t和宏CLOCKS_PER_SEC都可以是整數(shù)或浮點(diǎn)類型。如上面的示例中所示,將CPU時間值強(qiáng)制轉(zhuǎn)換為兩倍,可確保無論基礎(chǔ)表示是什么,算術(shù)和打印之類的操作都能正常且一致地工作。
在glibc 2.21中:
clock_t
是long int
:time / time.h將其設(shè)置為
__clock_t
bits / types.h將其設(shè)置為
__CLOCK_T_TYPE
bits / typesizes.h將其設(shè)置為
__SLONGWORD_TYPE
bits / types.h將其設(shè)置為
long int
clock()
在Linux中是通過sys_clock_gettime
以下方式實(shí)現(xiàn)的:man clock_gettime
,告訴我們它struct timespec
在GCC中返回包含long int
字段的。因此,底層實(shí)現(xiàn)實(shí)際上返回整數(shù)。
sysdeps / unix / sysv / linux / clock.c調(diào)用
__clock_gettime
sysdeps / unix / clock_gettime.c調(diào)用
SYSDEP_GETTIME_CPU
sysdeps / unix / sysv / linux / clock_gettime.c調(diào)用
SYSCALL_GETTIME
最終會進(jìn)行內(nèi)聯(lián)系統(tǒng)調(diào)用
也可以看看

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個贊
可能是因?yàn)闀r鐘節(jié)拍不是一個定義明確的單位。您可以將其轉(zhuǎn)換為秒并打印為雙精度:
time_in_seconds = (double)time_in_clock_ticks / (double)CLOCKS_PER_SEC;printf("%g seconds", seconds);
CLOCKS_PER_SEC宏擴(kuò)展為一個表達(dá)式,表示一秒鐘的時鐘滴答數(shù)。
- 3 回答
- 0 關(guān)注
- 2167 瀏覽
添加回答
舉報