2017-08-16 9 views
1

ナノ秒で現在の時刻が必要です。 文字列"%.9f" % float_timeは、1502872986.6536936 です。あなたは最後に76を見ることができます。 int(float_time*10**9)と同じ時刻を書き込もうとすると、最後には15028729866536936 と96になります。どうして?そして、それはナノフォーマットを得るための正しい方法ですか?文字列とint形式の浮動小数点の違い。どうして?

from time import time 

float_time = time() 
print("float_time:", float_time) 
int_nano_time = int(float_time*10**9) 
print("int_nano_time:", int_nano_time) 
str_nano_time = "%.9f" % float_time 
print("str_nano_time:", str_nano_time) 

float_time:1502872986.6536937

int_nano_time:1502872986653693696

str_nano_time:1502872986.653693676

ソリューション:

time.monotonic() 

float_time:536596.296

int_nano_time:5365962.96億

str_nano_time:536596.296000000

+1

[pythonはIEEE-754倍精度を使用します](https://docs.python.org/3.3/tutorial/floatingpoint.html)ので、有効数字部分にわずか53ビットあり、小数点は15〜17桁です(1502872986.6536936残りはちょうどノイズです) –

+1

@Eleena返される 'time()'はナノ秒の精度には正しくない可能性が非常に高いです。 –

+0

@AnttiHaapalaは、Pythonでintでnanosecを取得することは可能ですか? C++の世界では、64ビット整数で取得するので、問題はありません。彼らはIEEE754を満たしていません。 – Elena

答えて

1

どちらが〜15.7桁のIEEE754倍精度内の正しいです。その理由は、10の倍数は正確には生成できないため、2 ** 10の乗算が正確で、5 ** 10を乗算すると丸め誤差が再び発生し、最後の数が異なるのです。これら2浮動小数点数の

'1502872986.653693675994873046875000000000' 
>>> "%.30f" % (1502872986.653693676 * 10 ** 9) 
'1502872986653693696.000000000000000000000000000000' 

進表現は乱暴に異なっている:time()呼び出しから返された時間については

>>> (1502872986.653693676 * 10 ** 9).hex() 
'0x1.4db4704d00617p+60' 
>>> (1502872986.653693676).hex() 
'0x1.6650166a9d61ep+30' 

- まあ、コンピュータがそのタイマーを持っていなければならない可能性が高いです精度が十分に高いタイムスタンプを返します時刻の正確な時刻は、time()が呼び出された時刻と、返された時刻の間になります。

>>> (time() - time()) * 10 ** 9 
-715.2557373046875 
>>> (time() - time()) * 10 ** 9 
-953.67431640625 
>>> (time() - time()) * 10 ** 9 
-953.67431640625 

エラーは20ナノ秒でしたが、time()コールから返された2つの連続するタイムスタンプの時間差は、コンピュータでは700-100ナノ秒です。

関連する問題