《算法技术手册》一3.4.3 浮点值的比较

简介: 本节书摘来华章计算机《算法技术手册》一书中的第3章 ,第3.4.3节, George T.Heineman Gary Pollice Stanley Selkow 著 杨晨 曹如进 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.4.3 浮点值的比较

因为浮点值只是近似,所以即使是最简单的浮点操作都有可能出错。例如如下表达式:
if (x == y) {...}
这个表达式是真的表示两个浮点数完全相等吗?或者是表示这两个数近似相等吗(这种情况下可以使用≌这个符号)?有没有两个值虽然不同,但是相差非常小却仍然被认为是相等的呢?我们来看个例子,笛卡儿坐标系上有三个点,p0 = (a, b)、p1 = (c, d)和p2 = (e, f),表示两个有向线段(p0, p1)和(p1, p2)。我们能够使用(c - a)(f - b) - (d - b)(e - a)这个式子来计算这两条线段是否共线(也就是在同一条线上)。如果这个式子的结果:
2017_09_20_111209
为了展示了Java 浮点计算中误差是如何产生的考虑使用表3-3中a~f的值定义3个点。
表3-3:浮点算术误差
2017_09_20_111242
可以很明显地看出,这p0、p1、p2三个点其实是共线的,而且直线方程是y = 5*x。当使用浮点数计算判断线段的共线性时,浮点运算中的固有误差影响了浮点运算的结果。使用32位单精度浮点数的时候,计算结果是0.00048828125。而使用双精度浮点数(64位),计算出来的结果却是一个很小的负数!这个例子生动地展现了无论是32位还是64位浮点数,它们都无法准确地表示计算出实际的数值,因此无法确定这两条线段是否共线。这就是浮点世界的常态。
常见的一种解决办法是引入一个非常小的值δ,来决定两个浮点数是否存在≌(近似相等)关系。如果|x - y|<δ,那么认为x和y是相等的。但是,即便这样,如果存在x≌y和y≌z,但是x≌z可能并不为真。这不但违背了数学运算的传递性,而且增加了编写正确代码的难度。而且这种办法并没有解决共线性问题,因为共线性问题的确定用的是值的符号(0,正,负)而不是相等与否。

相关文章
|
5月前
|
运维 监控 算法
基于 Java 滑动窗口算法的局域网内部监控软件流量异常检测技术研究
本文探讨了滑动窗口算法在局域网流量监控中的应用,分析其在实时性、资源控制和多维分析等方面的优势,并提出优化策略,结合Java编程实现高效流量异常检测。
236 0
|
6月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
158 2
|
8月前
|
监控 算法 JavaScript
基于 JavaScript 图算法的局域网网络访问控制模型构建及局域网禁止上网软件的技术实现路径研究
本文探讨局域网网络访问控制软件的技术框架,将其核心功能映射为图论模型,通过节点与边表示终端设备及访问关系。以JavaScript实现DFS算法,模拟访问权限判断,优化动态策略更新与多层级访问控制。结合流量监控数据,提升网络安全响应能力,为企业自主研发提供理论支持,推动智能化演进,助力数字化管理。
214 4
|
8月前
|
存储 监控 算法
内网监控桌面与 PHP 哈希算法:从数据追踪到行为审计的技术解析
本文探讨了内网监控桌面系统的技术需求与数据结构选型,重点分析了哈希算法在企业内网安全管理中的应用。通过PHP语言实现的SHA-256算法,可有效支持软件准入控制、数据传输审计及操作日志存证等功能。文章还介绍了性能优化策略(如分块哈希计算和并行处理)与安全增强措施(如盐值强化和动态更新),并展望了哈希算法在图像处理、网络流量分析等领域的扩展应用。最终强调了构建完整内网安全闭环的重要性,为企业数字资产保护提供技术支撑。
250 2
|
9月前
|
存储 监控 算法
基于 Python 哈希表算法的局域网网络监控工具:实现高效数据管理的核心技术
在当下数字化办公的环境中,局域网网络监控工具已成为保障企业网络安全、确保其高效运行的核心手段。此类工具通过对网络数据的收集、分析与管理,赋予企业实时洞察网络活动的能力。而在其运行机制背后,数据结构与算法发挥着关键作用。本文聚焦于 PHP 语言中的哈希表算法,深入探究其在局域网网络监控工具中的应用方式及所具备的优势。
306 7
|
9月前
|
存储 算法 物联网
解析局域网内控制电脑机制:基于 Go 语言链表算法的隐秘通信技术探究
数字化办公与物联网蓬勃发展的时代背景下,局域网内计算机控制已成为提升工作效率、达成设备协同管理的重要途径。无论是企业远程办公时的设备统一调度,还是智能家居系统中多设备间的联动控制,高效的数据传输与管理机制均构成实现局域网内计算机控制功能的核心要素。本文将深入探究 Go 语言中的链表数据结构,剖析其在局域网内计算机控制过程中,如何达成数据的有序存储与高效传输,并通过完整的 Go 语言代码示例展示其应用流程。
182 0
|
3月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
381 0
|
3月前
|
数据采集 分布式计算 并行计算
mRMR算法实现特征选择-MATLAB
mRMR算法实现特征选择-MATLAB
255 2
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
263 3

热门文章

最新文章