我怎么知道要使用哪种类型的浮子?

时间:2018-08-11 09:50:49

标签: python numpy types floating-point precision

我的问题是:给出一个浮点数,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,该类型的精确度是什么。

1 个答案:

答案 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:所有浮点表示形式都可能包含舍入误差。