2017-08-16 63 views
1

我需要nanosec的當前時間。 作爲字符串"%.9f" % float_time它是1502872986.6536936 。最後你可以看到76。 如果我嘗試寫的同時,INT 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有17位有效數字,其餘只是噪聲) –

+1

@Elena很可能返回的'time()'不正確到納秒精度。 –

+0

@AnttiHaapala是否有可能在Python中獲得int int的nanosec?在C++世界裏,他們沒有問題,因爲他們在64位int中得到它。他們不符合IEEE754。 – Elena

回答

1

兩者都是〜15.7十進制數字的IEEE754的雙精度內是正確的。其原因是,十倍數不能精確地產生,因此,儘管通過2 ** 10乘以準確,通過5 ** 10乘以將再次有舍入誤差,這就是爲什麼在過去數不同。

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

這兩個浮點數的十六進制表示是很大的不同:

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

至於從time()調用返回的時間 - 也極有可能的是,計算機應該有一個計時器,給人以足夠的精度高任何時間值會的確切時間time()之間的時間戳被稱爲當它返回:

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

你的錯誤爲20納秒,但連續2個時間戳之間的時間差從返回調用time()是我的電腦上700-100納秒。

相關問題