对于numpy,我试图理解在精度损失小于或等于0.001的情况下,可以从float64降到float32的最大值是什么.

由于我在网上找不到简单的解释,我很快想出了这段代码来测试:

result = {}
for j in range(1,1000):
    for i in range (1, 1_000_000):
        num = i + j/1000
        x=np.array([num],dtype=np.float32)
        y=np.array([num],dtype=np.float64)
        if abs(x[0]-y[0]) > 0.001:
            result[j] = i
            break

根据结果,似乎没有任何正值<32768可以安全地从float64向下浇铸到float32,精度损失可以接受(给定标准<=0.001)

对吗?

谢谢

推荐答案

假设IEEE 754表示法,float32的有效位精度为24位,而float64的有效位精度为53位(非规范数字除外).

为了表示一个绝对误差不超过0.001的数字,您需要在二进制点右边至少有9位,这意味着这些数字被舍入到1/512的最接近倍数,因此最大表示误差略低于1/1024=0.0009765625<;0.001.

总共有24个有效位,在二进制点的右侧有9个有效位,在二进制点的左侧有15个有效位,这可以代表所有整数,最大为215=32768,正如您通过实验确定的那样.

Python相关问答推荐

七段显示不完整

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

脚注在Python中使用regex导致错误匹配

将列表中的元素替换为收件箱中的元素

GEKKO:已知延迟的延迟系统的参数估计

将numpy矩阵映射到字符串矩阵

模型序列化器中未调用现场验证器

NumPy中的右矩阵划分,还有比NP.linalg.inv()更好的方法吗?

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

不理解Value错误:在Python中使用迭代对象设置时必须具有相等的len键和值

将数据框架与导入的Excel文件一起使用

管道冻结和管道卸载

删除字符串中第一次出现单词后的所有内容

Pandas计数符合某些条件的特定列的数量

使用Python更新字典中的值

连接一个rabrame和另一个1d rabrame不是问题,但当使用[...]'运算符会产生不同的结果

Asyncio:如何从子进程中读取stdout?

Pandas GroupBy可以分成两个盒子吗?

从Windows Python脚本在WSL上运行Linux应用程序

在Admin中显示从ManyToMany通过模型的筛选结果