printf를 사용하여 clock_t를 인쇄하는 올바른 방법은 무엇입니까?
저는 에 .unsigned long long
을 합니다.%llu
인쇄하려고 하지만, 그 이후로.size_t
가 있습니다.%z
왜자,왜는까가 요?clock_t
하나 있어요?
그것에 대한 매크로도 없습니다. 시스템 및 x64템(OS및 CPU)다수할는tn수할eenin(템su및4x(4는smx)dsize_t
입니다. (에도 8바이트를 합니다.)%z
), , clock_t
?
완벽한 방법은 없는 것 같습니다.clock_t
정수 또는 부동 소수점일 수 있습니다.
clock_t는 부동 소수점 유형일 수 있습니다.
Bastien Leonard가 POSIX에 대해 언급한 바와 같이, C99 N1256 초안 7.23.1/3은 다음과 같이 말합니다.
[clock_tis] 시간을 나타낼 수 있는 산술 형식
6.2.5/18:
정수형과 부동형을 합쳐서 산술형이라고 합니다.
그리고 표준은 산술 유형을 정수 또는 부동 소수점 유형으로 정의합니다.
CLOCKS_PER_SEC로 나누려면 Long double을 사용합니다.
의 clock()
정의되어 , 이고을수는한인은다는이과어y다는이so과tet은이인ndy,gy한eoddf고CLOCKS_PER_SEC
초수 찾기:
clock_t t0 = clock();
/* Work. */
clock_t t1 = clock();
printf("%Lf", (long double)(t1 - t0));
완벽하지는 않지만 다음과 같은 두 가지 이유로 충분합니다.
에 이 에는 아날로그가 없는 것 .
intmax_t
부동 소수점 유형의 경우:어떻게 하면 가장 큰 정밀한 부동 소수점 데이터 형태의 구현과 그 인쇄물 지정자를 얻을 수 있을까요?따라서 내일 더 큰 부동 소수점 유형이 나오면 이 유형이 사용되어 구현이 중단될 수 있습니다.한다면
clock_t
는 정수이며, 띄울 캐스트는 가능한 한 가장 가까운 띄울 것을 사용하도록 잘 정의되어 있습니다.정밀도를 큰 Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔΔ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ ΔΔ Δ Δ Δ Δ Δlong int
x86에서 80비트 플로트는 64비트로 상당하며, 이는 수백만 년 단위입니다.
가서 비슷한 말을 한 레모네드에게 투표하세요.
정수라고 가정할 경우 %ju와 uintmax_t를 사용합니다.
비록 ~일지라도unsigned long long
가능한가장 큰입니다:재한장큰준다수는다수준 .
따라서 가능한 최대 크기의 부호 없는 정수 유형으로 캐스트를 입력하는 것이 가장 좋습니다.
#include <stdint.h>
printf("%ju", (uintmax_t)(clock_t)1);
uintmax_t
기계에서 가능한 가장 큰 정수 크기를 갖는 것이 보장됩니다.
uintmax_t
쇄와그쇄가가쇄d쇄그s와ftrf .%ju
예를 들어 c99와 gcc에 도입되었습니다.
이것은 어떻게 믿을 수 있는지에 을 한 번, 그리고 합니다.printf
형의 )clock_t
).
만약 그것이 두 배일 경우 무엇이 잘못될 수 있습니까?
- 너무 커서 정수에 맞지 않는 경우, 정의되지 않은 동작
- 1보다 훨씬 작으면 0으로 반올림하고 아무것도 볼 수 없습니다.
이러한 결과는 부유 변환에 정수보다 훨씬 더 가혹하기 때문에 부유물을 사용하는 것이 더 나은 생각일 수 있습니다.
glibc 2.21에서 그것은 정수입니다.
설명서에 의하면 다음과 같이 되어 있습니다.double
생각입니다:은다더다은s더:ar.
GNU/리눅스 및 GNU/Hurd 시스템에서 clock_t는 longint와 같고 CLOCKs_PER_SEC는 정수 값입니다.그러나 다른 시스템에서는 clock_t와 매크로 CLOCKS_PER_SEC 모두 정수 또는 부동 소수점 유형일 수 있습니다.위의 예와 같이 CPU 시간 값을 두 배로 주조하면 기본 표현이 무엇이든 산술 및 인쇄와 같은 작업이 적절하게 일관되게 작동할 수 있습니다.
Inglibc 2.21:
clock_t
이다 ㅇlong int
:- time/time.h는 다음으로 설정합니다.
__clock_t
- bits/types.h는 다음으로 설정합니다.
__CLOCK_T_TYPE
- bits/typesize.h는 다음으로 설정합니다.
__SLONGWORD_TYPE
- bits/types.h는 다음으로 설정합니다.
long int
- time/time.h는 다음으로 설정합니다.
clock()
서됩니다.sys_clock_gettime
:- sysdeps/desp/despv/desp/desp/desp/clock.c 호출
__clock_gettime
- sysdeps/lock/clock_gettime.c 호출
SYSDEP_GETTIME_CPU
- sysdeps/desp/despv/desp/desp/desp/clock_get time.c 호출
SYSCALL_GETTIME
호출을 .
man clock_gettime
, 우리에게 그것이 a를 돌려준다고 말합니다.struct timespec
에서 GCC를 포함하는 것은 입니까?long int
따라서 기본 구현은 정수를 실제로 반환합니다.
- sysdeps/desp/despv/desp/desp/desp/clock.c 호출
참고 항목
내가 알기로는 당신이 하는 방식이 최고입니다.그것을 제외하고는clock_t
실제 유형일 수 있습니다.
time_t
그리고.clock_t
정수형 또는 실수형이어야 합니다.
http://www.opengroup.org/onlinepubs/009695399/basedefs/sys/types.h.html
시계 똑딱이가 잘 정의된 단위가 아니기 때문일 것입니다.초 단위로 변환하여 두 배로 인쇄할 수 있습니다.
time_in_seconds = (double)time_in_clock_ticks / (double)CLOCKS_PER_SEC;
printf("%g seconds", seconds);
CLOCKS_PER_SEC 매크로는 초 단위의 클럭 틱 수를 나타내는 식으로 확장됩니다.
C 표준은 다양한 아키텍처를 수용해야 하므로 내부 클럭 유형이 산술이라는 점 외에는 더 이상의 보장을 할 수 없습니다.
대부분의 경우, 당신은 시간 간격에 관심이 있기 때문에, 나는 시계 눈금의 차이를 밀리초로 변환할 것입니다.unsigned long
수 만큼 의 경우, 는 50비트을낼수의을로다기야가히는의에도의다야s가히는r의hee에는fhte2tn:,olsss ).
clock_t start;
clock_t end;
unsigned long millis = (end - start) * 1000 / CLOCKS_PER_SEC;
하나의 방법은 다음을 사용하는 것입니다.gettimeofday
기능. 기능을 사용하면 차이점을 찾을 수 있습니다 이 수 있습니다 : function this 기능을 이 찾을 using the rence diffe find one 기능 사용하면 차이점을 can : this
unsigned long diff(struct timeval second, struct timeval first)
{
struct timeval lapsed;
struct timezone tzp;
unsigned long t;
if (first.tv_usec > second.tv_usec) {
second.tv_usec += 1000000;
second.tv_sec--;
}
lapsed.tv_usec = second.tv_usec - first.tv_usec;
lapsed.tv_sec = second.tv_sec - first.tv_sec;
t = lapsed.tv_sec*1000000 + lapsed.tv_usec;
printf("%lu,%lu - %lu,%lu = %ld,%ld\n",
second.tv_sec, second.tv_usec,
first.tv_sec, first.tv_usec,
lapsed.tv_sec, lapsed.tv_usec);
return t;
}
언급URL : https://stackoverflow.com/questions/1083142/what-s-the-correct-way-to-use-printf-to-print-a-clock-t
'programing' 카테고리의 다른 글
쿼리 "not equal"이(가) 작동하지 않습니다. (0) | 2023.09.10 |
---|---|
Oracle에서 .sql 파일을 가져오시겠습니까? (0) | 2023.09.10 |
구성 파일을 파워셸 스크립트에 소개하려면 어떻게 해야 합니까? (0) | 2023.09.10 |
POST가 있는 AJAX reload 페이지 (0) | 2023.09.10 |
앵커 텍스트를 jquery로 바꿉니다. (0) | 2023.09.10 |