Ubuntu Linux 16.04 및 g++를 사용하여 Unix Epoch 또는 Windows Epoch와 임의의 날짜/시간 사이의 나노초 수를 계산할 때 마이크로초 또는 밀리초 세분성을 얻을 수 있는지 궁금합니다. time(NULL)의 time_t 결과에는 초 단위가 있는 반면, gettimeofday의 구조체 timeval 결과에는 밀리초 단위가 있다는 것을 알고 있습니다.
이 문제를 해결할 수 있는 다른 방법은 무엇입니까? 이것은 프로그래밍 질문이 아닙니다. 나는 이것을 테스트하기 위해 프로그램을 작성했으며 필요하다면 공유할 수 있습니다.
어떤 도움이라도 대단히 감사하겠습니다.
답변1
를 사용하여 이 작업을 수행할 수 있습니다 gettimeofday()
. 이것은StackOverflow에 대한 답변, 여기에 인용하겠습니다.
마이크로초 타임스탬프를 얻는 데는 두 가지 옵션이 있습니다. 첫 번째(그리고 가장 좋은) 옵션은 유형을 직접 사용하는 것입니다
timeval
.struct timeval GetTimeStamp() { struct timeval tv; gettimeofday(&tv,NULL); return tv; }
두 번째로 나에게 덜 이상적인 옵션은 uint64_t에서 uint64_t를 빌드하는 것입니다
timeval
.uint64_t GetTimeStamp() { struct timeval tv; gettimeofday(&tv,NULL); return tv.tv_sec*(uint64_t)1000000+tv.tv_usec; }
답변2
내 대답은 10진수64 형식을 사용하는 것입니다.
에서 인용https://en.wikipedia.org/wiki/Decimal64_floating-point_format:
컴퓨팅에서 10진수64는 컴퓨터 메모리에서 8바이트(64비트)를 차지하는 10진수 부동 소수점 컴퓨터 번호 지정 형식입니다. 재무 및 세금 계산과 같이 정확한 소수점 반올림 시뮬레이션이 필요한 애플리케이션에 적합합니다.
Decimal64는 16개의 소수 유효 숫자를 지원하며 지수 범위는 -383 ~ +384, 즉 ±0.000000000000000×10−383 ~ ±9.999999999999999×10384입니다. (±0000000000000000×10−398 ~ ±999999999999999×10369와 동일합니다.) 이와 대조적으로 가장 일반적으로 사용되는 이진 형식의 대략적인 범위는 ±0.000000000000001×10−308 ~ ±1.797693134862315×10 308입니다. 따라서 가장 큰 값 유효 숫자가 16개 미만이면 1×102=0.1×103=0.01×104 등 다양한 표현이 가능합니다. 0에 대한 가능한 표현은 768가지입니다(두 개의 부호 있는 0이 포함된 경우 1536).
Decimal64 부동 소수점은 2008 버전의 IEEE 754 [1] 및 ISO/IEC/IEEE 60559:2011에서 공식적으로 도입된 비교적 새로운 십진 부동 소수점 형식입니다.
다음은 10진수64 사용 방법을 설명하는 링크입니다.
https://stackoverflow.com/questions/12865585/stddecimaldecimal64-Cordirect-usage-g-4-6-3
답변3
Decimal64 float 솔루션이 가장 좋지만 익명 공용체를 사용하는 프로그래밍 마법이 필요합니다. decimal64를 std::string으로 변환하려면 2개의 멤버(이름이 S라고 가정), 10진수::decimal64 입력 및 uint64_t(C++99의 cstdint.h) 출력이 있는 공용체를 사용해야 합니다. 공용체에는 C++ 클래스이고 사용자 정의 생성자와 소멸자가 필요한 소수::decimal64 멤버가 있으므로 입력 멤버 값을 설정하고 출력 멤버 값을 변경하려면 새 put 연산자를 사용해야 합니다.
또한 프로그래머는 S 개체(예: 명명된 데이터)를 다음과 같이 초기화해야 합니다. S data = {12345678987654321ULL} 그래야 컴파일러가 배후에서 공용체 개체를 삭제하지 않습니다. 문제를 더욱 복잡하게 만드는 것은,decimal/decimal.h가 인라인 생성자 인라인decimal64::decimal64(decimal64__r)을 정의하지 않는다는 것입니다. 마지막으로 사용자는 10진수64에 대해 전역 ostream 연산자 <<를 작성해야 합니다.
내 삶을 단순화하기 위해 오늘은 uint64_t를 사용하여 오늘날 Windows 시대의 나노초 수를 나타냅니다. 이 옵션은 int64_t 번호 오버플로 오류를 수정했습니다.
uint64_t와 십진수64 사이의 절충점은 십진수64가 uint64_t보다 더 큰 동적 범위를 갖는다는 것입니다. 또한 uint64_t의 printf에는 특수 형식 지정자가 필요합니다.
#include <inttypes.h>
uint64_t t;
printf("%" PRIu64 "\n", t);
질문이 있거나 코드 예제가 필요하면 알려주시기 바랍니다.