2016-11-01 1 views
4

나는이 함수를 호출 할 때마다 부동 소수점 시간 (밀리 초)을 float로 최대 30 회/초로 늘리려고합니다. 아래의 함수가 반환하는 타임 스탬프는 항상 동일하지만, std::cerr에 인쇄하면 다른 값을 얻습니다. 내가 함수를 호출 할 때마다 변수를 생성하고 있으므로 내가 여기서 잘못하고 있는지 확실하지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 제안 당으로 나는 C++ (11)를 사용하여이 Windows x64, x86 및 리눅스 (주로 우분투에 CentOS) 모두에서이 컴파일 할 필요가 있어요 :결과 호출시 타임 스탬프에 대해 동일한 값 가져 오기

float GetUnixTimestamps() 
    { 
     float milliseconds_since_epoch = 
     std::chrono::duration_cast<std::chrono::milliseconds> 
     (std::chrono::system_clock::now().time_since_epoch()).count(); 

    std::cerr << milliseconds_since_epoch << std::endl; 
    return milliseconds_since_epoch; 
    } 

편집 할 수 있습니다. 나는 유닉스에서 현재 시간을 얻고 싶다. 나는 S.O 게시물 1955512116177295을 이미 읽었지 만 값은 여전히 ​​타임 스탬프에 대해 동일하게 유지됩니다.

+2

은 컴파일러 최적화와 비슷합니다. [mcve]를 게시 할 필요가 있으며 컴파일러와 컴파일 플래그를 명시해야합니다. –

+0

"항상 같습니다"를 정의하십시오. –

+0

예를 들어 첫 번째 호출에서 1478019383296을 얻었고 두 번째 호출에서 같은 함수를 호출하면 1478019383296과 동일한 값을 얻게됩니다. 2016 년 11 월 1 일 16 : 56 : 23.296 GMT는 밀리 초 단위로 변환되기 때문에 다음 통화를 기준으로 값이 변경됩니다. –

답변

5

float 님의 정밀도는 원하는대로 할 수 없습니다. 1970-01-01 년 이후의 현재 밀리 초는 약 1,478,020,169,728입니다. 이 후에 float의 다음 표현 가능 값은 1,478,020,300,800입니다. 그것은 약 131s (2min) 후입니다.

double가 여기에 해당합니다.

+2

하하, 주목하자! 나는 무의식적으로 OP를'float'을'double'으로 변환했습니다. – AndyG

+0

글쎄, 당신은 *'* '(물론 많은 다른 것들)입니다. 참으로 엄청난 권위있는 응답. +1 – skypjack

+0

감사합니다. @Howard가 float에서 double로 바뀌면서 제 질문이 해결되었습니다. –

관련 문제