估计或绑定Python中的浮点转换错误



我正在从包含数字的csv文件中读取数据,并将其转换为numpy float32/float64。

我想得到转换时的误差估计(或界限(。理想情况下,我想得到一个函数,告诉我文件中的数字n我犯了什么错误。我知道这可能并不容易,因为数字需要以完美的精度读取。我还没有找到一个允许这样做的numpy类型。因此,我从一个更简单的问题开始,现在我正试图根据Python中声明的数字来估计误差。

我从下面的代码开始:

import numpy as np
n = 71238457.2500001
print(n-np.float64(n))
print(n-np.float32(n))
print(np.float64(n)-np.float32(n))

然而,当在Python中声明我的数字n时,我认为它会自动构建一个float64。因此,我最终对float64的转换没有错误,对最后两个操作(转换为float32,从float64转换为floate32(也有相同的结果:

0.0
1.2500001043081284
1.2500001043081284

对于给定的数字,函数是什么来获得、估计或绑定float32/float64转换的误差?

我假设您的数字不会太大,并且表示形式的差异只存在于小数部分,而不存在于整数部分。

Python的整数是精确的。考虑使用整数计算差值的小数部分。Python最多可打印26位小数:

n = '71238457.2500001'
n_orig = int(n.split(".")[1].ljust(26, "0"))
n_fl32 = int("{:.26f}".format(np.float32(n)).split(".")[1])
n_fl64 = int("{:.26f}".format(np.float64(n)).split(".")[1])
print(f"{n_fl64-n_fl32:026}e-26")
#25000010430812835693359375e-26
print(f"{n_fl64-n_orig:026}e-26")
#00000000430812835693359375e-26
print(f"{n_orig-n_fl32:026}e-26")
#25000010000000000000000000e-26

根据@DYZ的答案,单独获得整数部分并不太困难:

n = '71238457.2500001'
n_orig_int = int(n.split(".")[0])
n_orig_dec = int(n.split(".")[1].ljust(26, "0"))
n_fl32_int = int("{:.26f}".format(np.float32(n)).split(".")[0])
n_fl32_dec = int("{:.26f}".format(np.float32(n)).split(".")[1])
n_fl64_int = int("{:.26f}".format(np.float64(n)).split(".")[0])
n_fl64_dec = int("{:.26f}".format(np.float64(n)).split(".")[1])
print(n_orig_int-n_fl64_int)
print(n_orig_int-n_fl32_int)
print(n_fl64_int-n_fl32_int)
print(f"{n_orig_dec-n_fl64_dec:026}e-26")
print(f"{n_orig_dec-n_fl32_dec:026}e-26")
print(f"{n_fl64_dec-n_fl32_dec:026}e-26")

将给出:

0
1
1
-0000000430812835693359375e-26
25000010000000000000000000e-26
25000010430812835693359375e-26

在那之后,如果你想把这两个部分组合成一个输出,由于符号的原因,它会变得有点难看。

分配给一个变量,然后减去它们以查看差异

x= np.float64(n)
y = np.float32(n)
print(x-y)

最新更新