programing

printf를 사용하여 clock_t를 인쇄하는 올바른 방법은 무엇입니까?

powerit 2023. 9. 10. 13:10
반응형

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 intx86에서 80비트 플로트는 64비트로 상당하며, 이는 수백만 년 단위입니다.

가서 비슷한 말을 한 레모네드에게 투표하세요.

정수라고 가정할 경우 %ju와 uintmax_t를 사용합니다.

비록 ~일지라도unsigned long long 가능한가장 큰입니다:재한장큰준다수는다수준 .

  • 미래에 더 큰 것이 나올 수 있습니다.
  • 표준은 이미 명시적으로 더 큰 구현 정의된 유형(kudos to @FUZxxl)을 허용합니다.clock_t그들 중 하나일 수도 있습니다.

따라서 가능한 최대 크기의 부호 없는 정수 유형으로 캐스트를 입력하는 것이 가장 좋습니다.

#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실제 유형일 수 있습니다.

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

반응형