2016-11-01 11 views
4

私はおそらく30回/秒のこの関数を呼び出すたびに、floatでunixタイムスタンプをミリ秒まで取得しようとしています。以下の関数が返すタイムスタンプは常に同じですが、std::cerrに出力すると異なる値が得られます。関数を呼び出すたびに変数を作成しているので、ここで間違っていることがわかりません。どんな助けもありがとう。提案 1として、私はC++ 11を使用し、Windowsのx64、x86およびLinuxの(主にUbuntuと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; 
    } 

EDIT。私はUNIXで現在の時間を取得したいと思います。私はすでにS.Oの投稿1955512116177295を読んでいますが、その値はタイムスタンプでも変わりません。

+2

は、コンパイラの最適化のようです。 [mcve]を投稿する必要があります。また、どのコンパイラとどのコンパイルフラグを使用しているかを記述する必要があります。 –

+0

"常に同じです"を定義してください。 –

+0

たとえば、最初の呼び出しは1478019383296、同じ関数への2回目の呼び出しでは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です。それは約131秒後(2分)です。

doubleはここで行います。

+2

ハハ、スポットに!私は無意識のうちに自分のテストでOPを 'float'から' double 'に変換しました。 – AndyG

+0

さて、あなたは* ''です(もちろん他にもたくさんあります)。確かにかなりのauthorative応答。 +1 – skypjack

+0

ありがとう@私の質問を解決するためにフロートから二重に変更しました。 –

関連する問題