Python 将time.time()转换为float32时出现意外行为

Python 将time.time()转换为float32时出现意外行为,python,numpy,precision,floating-accuracy,Python,Numpy,Precision,Floating Accuracy,我想将历元时间数组存储为dtype32的numpy数组。我希望失去准确性,但不是30秒差 np.float64(np.float32((time.time()))) - time.time() 有人能解释发生了什么事吗?如何将历元时间存储为float32而不丢失准确性?秒,因为历元是一个大数字。目前大约是1.5e9。在这个范围内,您会得到10秒内的精度误差 首先,您要调用两次time.time(),这加剧了时差——调用这些方法显然需要时间。查看错误的更好方法是存储时间: >>&g

我想将历元时间数组存储为dtype32的numpy数组。我希望失去准确性,但不是30秒差

np.float64(np.float32((time.time()))) - time.time()

有人能解释发生了什么事吗?如何将历元时间存储为float32而不丢失准确性?

秒,因为历元是一个大数字。目前大约是1.5e9。在这个范围内,您会得到10秒内的精度误差

首先,您要调用两次
time.time()
,这加剧了时差——调用这些方法显然需要时间。查看错误的更好方法是存储时间:

>>> import time
>>> import numpy as np
>>> t = time.time()
>>> np.float32(t) - t
62.610707998275757
通过从numpy获取字符串表示形式,可以查看存储的实际十进制数:

>>> t
1512746305.389292
>>> np.float32(t).astype(str)
'1512746368.0'
记住,数字不是位,只有0和1是位。在32位浮点中,您以科学记数法存储数字,但以二进制存储。这会降低准确性。可表示为32位浮点的值范围为-3.4e38到+3.4e38。有2^32个数字可以用32位表示……很明显,在32位浮点范围内,您缺少了大量(无限多个…)可能的数字

有两个超级简单的解决方案

首先,如果你不关心亚秒,那么就把它存储为一个整数。直到2038年,大纪元时间甚至不会达到32位最大值。(您好,2037年的SO用户担心维基百科仍然存在吗?)

当然,如果你想要更高的十进制精度…在转换为int之前乘以10、100或1000。好吧,你可以累积错误,但如果使用64位浮点,你应该可以

第二种处理方法是只存储一个新的历元时间,并将其与要保存在数组中的时间的差取出来。这些较小数字的误差将远远超出小数范围

>>> new_epoch = time.time()
>>> t = time.time() - new_epoch
>>> np.float32(t) - t
-2.384185791015625e-07
然后只需将新纪元与32位浮点时间数组一起保存在64位glory中,这样您就知道如何转换回去

但是,请注意,从以下方面:

尽管时间总是以浮点数的形式返回,但并非所有系统提供的时间精度都优于1秒


我也强烈推荐大卫·戈德伯格的著名文章。即使只是前几页,也会对浮点运算以及如何计算近似误差的大小给出很好的概述

时代以来的秒是个大数字。目前大约是1.5e9。在这个范围内,您会得到10秒内的精度误差

首先,您要调用两次
time.time()
,这加剧了时差——调用这些方法显然需要时间。查看错误的更好方法是存储时间:

>>> import time
>>> import numpy as np
>>> t = time.time()
>>> np.float32(t) - t
62.610707998275757
通过从numpy获取字符串表示形式,可以查看存储的实际十进制数:

>>> t
1512746305.389292
>>> np.float32(t).astype(str)
'1512746368.0'
记住,数字不是位,只有0和1是位。在32位浮点中,您以科学记数法存储数字,但以二进制存储。这会降低准确性。可表示为32位浮点的值范围为-3.4e38到+3.4e38。有2^32个数字可以用32位表示……很明显,在32位浮点范围内,您缺少了大量(无限多个…)可能的数字

有两个超级简单的解决方案

首先,如果你不关心亚秒,那么就把它存储为一个整数。直到2038年,大纪元时间甚至不会达到32位最大值。(您好,2037年的SO用户担心维基百科仍然存在吗?)

当然,如果你想要更高的十进制精度…在转换为int之前乘以10、100或1000。好吧,你可以累积错误,但如果使用64位浮点,你应该可以

第二种处理方法是只存储一个新的历元时间,并将其与要保存在数组中的时间的差取出来。这些较小数字的误差将远远超出小数范围

>>> new_epoch = time.time()
>>> t = time.time() - new_epoch
>>> np.float32(t) - t
-2.384185791015625e-07
然后只需将新纪元与32位浮点时间数组一起保存在64位glory中,这样您就知道如何转换回去

但是,请注意,从以下方面:

尽管时间总是以浮点数的形式返回,但并非所有系统提供的时间精度都优于1秒


我也强烈推荐大卫·戈德伯格的著名文章。即使只是前几页,也会对浮点运算以及如何计算近似误差的大小给出很好的概述

您希望如何准确地将32位整数存储在32位浮点中而不丢失精度?我是否可以将精度保持在秒级?我不介意在亚秒(小数)内失去精度。另外,数字大约是1.5e9,我想这可以准确地存储在float32中?有很多数字,floats无法完全精确地存储,甚至在你进入严重不准确的领域之前。更不用说您正在比较两个不同的调用
time.time()
,由于执行顺序的原因,这两个调用之间已经存在一些亚秒级的差异。@Zinki
time.time()
返回一个64位浮点,而不是32位int,顺便说一句。
类型(time.time())=
“另外,数字大约是1.5e9,我想这可以准确地存储在float32中?“谁给你这个主意的?你不能将1/3精确地存储在一个浮点数中!如果你不关心亚秒,那么为什么不直接使用整数呢?你到底希望如何在32位浮点中存储32位整数而不丢失精度?我是否可以在秒级上保持精度?我不介意在亚秒(小数)内失去精度。另外,数字大约是1.5e9,我想这可以准确地存储在float32中?有很多数字,floats无法完全精确地存储,甚至在你进入严重不准确的领域之前。更不用说您正在比较两个不同的调用
time.time()
,由于执行顺序的不同,这两个调用已经存在一些亚秒级的差异。@Zinki
time.time