【问题标题】:Float difference in string and int format. Why? [duplicate]string 和 int 格式的浮点数差异。为什么? [复制]
【发布时间】:2017-08-16 09:14:00
【问题描述】:

我需要纳秒的当前时间。 作为字符串"%.9f" % float_time,它是1502872986.653693676。你可以在最后看到 76。 如果我尝试与 int int(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

【问题讨论】:

  • python uses IEEE-754 double precision,因此有效位只有 53 位,大约是 15-17 个十进制数字(1502872986.6536936 有 17 个有效数字,其余只是噪声)
  • @Elena 返回的time() 很可能不正确到纳秒精度。
  • @AnttiHaapala 是否有可能在 python 的 int 中获得 nanosec?在 C++ 世界中,他们没有问题,因为他们得到了 64 位整数。它们不符合 IEEE754。
  • @Elena 正如我试图解释的那样,如果你使用time() 返回的时间,它的精度并不重要,因为 both 瞬间 1502872986653693696 和 15028729866536937 发生了 而 time() 函数正在获取时间戳并将时间戳转换为浮点对象等。

标签: python python-3.x precision floating-accuracy nanotime


【解决方案1】:

在约 15.7 个十进制数字的 IEEE754 双精度范围内,两者都是正确的。原因是 10 的倍数不能精确得出,所以虽然乘以 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 纳秒,但在我的计算机上,time() 调用返回的 2 个连续时间戳之间的时间差是 700-100 纳秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-08
    • 2023-01-26
    • 1970-01-01
    • 2023-03-29
    • 2019-11-19
    • 2021-12-20
    • 1970-01-01
    • 2016-08-25
    相关资源
    最近更新 更多