字符串和整数格式的浮点数差异。为什么?
Float difference in string and int format. Why?
我需要纳秒的当前时间。
作为字符串 "%.9f" % float_time
,它是 1502872986.653693676。最后可以看到76。
如果我尝试写和intint(float_time*10**9)
一样的时间,最后会是1502872986653693696和96。为什么?获得 nano 格式的正确方法是什么?
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: 536596296000000
str_nano_time: 536596.296000000
两者都在 ~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()
调用返回的时间 - 很可能计算机应该有一个计时器,它可以提供足够高精度的时间戳 any时间值将介于 time()
被调用的确切时间和它返回的时间之间:
>>> (time() - time()) * 10 ** 9
-715.2557373046875
>>> (time() - time()) * 10 ** 9
-953.67431640625
>>> (time() - time()) * 10 ** 9
-953.67431640625
你的错误是 20 纳秒,但从 time()
调用返回的 2 个连续时间戳之间的时间差在我的计算机上是 700-100 纳秒。
我需要纳秒的当前时间。
作为字符串 "%.9f" % float_time
,它是 1502872986.653693676。最后可以看到76。
如果我尝试写和intint(float_time*10**9)
一样的时间,最后会是1502872986653693696和96。为什么?获得 nano 格式的正确方法是什么?
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: 536596296000000
str_nano_time: 536596.296000000
两者都在 ~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()
调用返回的时间 - 很可能计算机应该有一个计时器,它可以提供足够高精度的时间戳 any时间值将介于 time()
被调用的确切时间和它返回的时间之间:
>>> (time() - time()) * 10 ** 9
-715.2557373046875
>>> (time() - time()) * 10 ** 9
-953.67431640625
>>> (time() - time()) * 10 ** 9
-953.67431640625
你的错误是 20 纳秒,但从 time()
调用返回的 2 个连续时间戳之间的时间差在我的计算机上是 700-100 纳秒。