栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

进行浮动比较

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

进行浮动比较

不,这不是比较浮点值的正确方法。

您实际上并没有说出真正的问题-出于某些原因要尝试比较两个浮点数,但是您没有说出它是什么。

浮点算术旨在执行近似算术。通常在浮点运算中会产生舍入误差。当以不同方式计算值时,这些误差通常会有所不同,因此不应期望浮点算术产生相同的结果。

在您的示例中,发生了以下操作:

  • 十进制数字“ 0.1”被转换为

    float64
    (IEEE-754 64位二进制浮点数)。这产生了值0.1000000000000000055511151231257827021181583404541015625,它是最接近
    float64
    0.1的值。

  • 十进制数字“ 0.2”被转换为

    float64
    。这产生了0.200000000000000011102230246251565404236316680908203125,它是最接近
    float64
    0.2的值。

  • 这些已添加。这产生了0.3000000000000000444089209850062616169452667236328125。除了将0.1和0.2舍入到in中的最接近值时发生的舍入误差外

    float64
    ,这还包含一些额外的舍入误差,因为无法在中表示精确的和
    float64

  • 十进制数字“ 0.3”转换为

    float64
    。这产生了0.299999999999999988897769753748434595763683319091796875,它是最接近
    float64
    0.3的值。

如您所见,相加

0.1
和的结果与
0.2
累计了不同的舍入误差
0.3
,因此它们是不相等的。没有正确的平等测试会报告他们平等。而且,重要的是,此示例中发生的错误是此示例特有的-
不同的浮点运算序列将具有不同的错误,并且累积的错误 不限于数字的低位

有人尝试通过测试差异是否小于某个小值来进行比较。在某些应用程序中可以这样做,但是在您的应用程序中可以吗?我们不知道您要做什么,因此我们不知道会发生什么问题。允许出现小错误的测试有时会报告错误的结果,要么是误报(因为接受的是相等的数字,如果使用精确的数学计算将不会等于结果),要么是误报负的(因为接受测试的结果是相等的数字,如果使用精确的数学计算将不会相等)精确数学)。这些错误中的哪一个对您的应用最严重?其中之一会导致机器损坏或对人造成伤害吗?在不知道这一点的情况下,没有人会建议哪个错误的结果是可以接受的,甚至可以接受。

此外,误差的容忍度应该是多大?计算中可能发生的总误差取决于执行的操作顺序和涉及的数量。有些应用程序的最终取整误差很小,而有些应用程序的误差很大。在不进一步了解您的特定操作顺序的情况下,没有人会建议使用什么值作为公差。同样,解决方案可能不是在比较数字时接受公差,而是重新设计计算以避免错误或至少减少误差。

不存在用于比较浮点值是否相等的通用解决方案,因为不可能存在任何这样的解决方案。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/633138.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号