我的问题是:给出一个浮点数,numpy
中的最小类型是什么?请考虑以下示例:
dt = datetime.datetime(2018, 8, 1, 17, 32, 53, 966819)
dt_unix = dt.timestamp()
print(dt_unix)
print(np.float32(dt_unix))
print(np.float64(dt_unix))
print(np.finfo(np.float32).precision)
输出为:
1533115973.966819
1533116000.0
1533115973.966819
6
很显然,np.float32
似乎无法保留它,但是我以前怎么知道呢?毕竟,建议的精度为6。因此,一般而言,特定类型的范围是多少,例如np.float32
,该类型的精确度是什么。
答案 0 :(得分:3)
np.finfo
提供了有关数据类型的各种信息。我发现epsneg
在这里最方便使用:它是最小的x,因此1-x的表示形式不同于1。只要N和N-1是不同的,整数N就可以准确表示。这意味着适合浮点格式的整数的上限为1/epsneg
:
print(1/np.finfo(np.float16).epsneg) # 2048
print(1/np.finfo(np.float32).epsneg) # 16777216
print(1/np.finfo(np.float64).epsneg) # 9007199254740992
print(1/np.finfo(np.float128).epsneg) # 18446744073709551616
这更加复杂,因为大多数实数(如0.1
)都不能以NumPy的任何浮点格式精确表示。我们可以先尝试最精确的可用格式,然后检查较小的格式是否仍以相同的方式表示。
>>> x = np.float128('0.9764404296875')
>>> np.float64(x) == x
True
>>> np.float32(x) == x
True
>>> np.float16(x) == x
False
因此,此数字精确地由float32表示,而不由float16表示。
再说一次,这主要是理论上的,因为如果该数字不是专门为该演示而创建的,则每次可能会得到False:所有浮点表示形式都可能包含舍入误差。