第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用printf打印clock_t的正確方法是什么?

使用printf打印clock_t的正確方法是什么?

C iOS
ibeautiful 2019-09-26 11:01:00
使用printf打印clock_t的正確方法是什么?我當(dāng)前正在使用顯式強(qiáng)制轉(zhuǎn)換unsigned long long并%llu用于打印它,但是既然size_t有說明%z符,為什么沒有clock_t一個?甚至沒有宏。也許我可以假設(shè)在x64系統(tǒng)(操作系統(tǒng)和CPU)size_t上長度為8個字節(jié)(即使在這種情況下,它們也提供了%z),但是那又如何clock_t呢?
查看完整描述

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ù)類型:

因此,最好將類型轉(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中:

也可以看看


查看完整回答
反對 回復(fù) 2019-09-26
?
臨摹微笑

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ù)。


查看完整回答
反對 回復(fù) 2019-09-26
  • 3 回答
  • 0 關(guān)注
  • 2167 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號