为什么浮点数不能直接比较大小

本文解析了浮点数在计算机中的表示方式及其对运算的影响,揭示了为什么看似简单的数学等式在计算机中可能不成立的原因,同时探讨了0.1+0.5==0.6为何在计算机中为真的原理。

以JS为例
在这里插入图片描述
在这里插入图片描述
简短的解释就是,浮点数在计算机中大部分都是近似
0.1 可以表示为
0.000110011001100110011001100110011001100110011001100110…
其后是一个无限循环的小数,计算机只能截断,很显然截断后的数就已经是0.1的近似值了,但是两个0.1的在计算机的表示是一致的,所以0.1==0.1是成立的
在这里插入图片描述
而经过计算后的浮点数,是两个近似值计算得到值,计算机不能把他识别为是1位小数0.3而是0.3000…4,与真计算值的表示方式很可能是不相同的,所以他们不等。

再来解释为什么0.1+0.5==0.6是true

因为0.5在计算机是可以准确表示为0.1000000000的,那么一个被截断的数和他相加后得到的虽然也是一个近似值,但是0.1小数第一位后面的0和1,在0.1+0.5计算中是没有变过的,他们的表示方式和0.6小数第一位后面的0和1是相同的

所以即使这是一个0.6的近似数,比较结果是true

我还有一个疑问是,计算机如何把0.0001100110011001…输出的时候转换为0.1?

在PyTorch中,可以直接使用比较运算符(如`==`、`!=`、`<`、`>`)对浮点数进行比较操作。这些运算符会逐元素地对张量中的浮点数进行比较,并返回一个布尔类型的张量,表示每个位置的比较结果。例如,若需要判断一个张量中哪些位置的元素等于0,可以使用`torch.eq(t, 0)`或直接使用`t == 0`,其中`t`为一个包含浮点数的张量[^1]。 需要注意的是,浮点数在计算机中的表示存在精度问题,因此在比较两个浮点数是否相等时,直接使用`==`可能会因为精度误差导致结果不准确。为了避免这种情况,可以使用`torch.isclose()`函数,它允许设置一个容差范围(通过`rtol`和` atol`参数),以判断两个浮点数是否“足够接近”,从而更可靠地进行相等性判断。例如: ```python import torch # 创建一个包含浮点数的张量 t = torch.tensor([[0.0, 1.0, 0.0], [2.0, 0.0, 3.0], [0.0, 4.0, 0.0]]) # 使用 == 直接比较 mask1 = t == 0.0 print("Using == 0.0:") print(mask1) # 使用 torch.isclose 比较 mask2 = torch.isclose(t, torch.tensor(0.0)) print("Using torch.isclose:") print(mask2) ``` 输出结果为: ``` Using == 0.0: tensor([[ True, False, True], [False, True, False], [ True, False, True]]) Using torch.isclose: tensor([[ True, False, True], [False, True, False], [ True, False, True]]) ``` 在上述示例中,`t == 0.0`和`torch.isclose(t, 0.0)`的结果是一致的,但在处理涉及浮点运算的结果时,推荐使用`torch.isclose()`以避免因精度问题导致的误判。 ### 总结 - 对于精确匹配,可以直接使用比较运算符如`==`,但在涉及浮点运算时需谨慎。 - 对于更鲁棒的浮点比较,应使用`torch.isclose()`,它允许一定的误差范围,从而避免精度问题带来的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值