《算法技术手册》一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,正,负)而不是相等与否。

相关文章
|
9天前
|
算法
R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
R语言使用随机技术差分进化算法优化的Nelson-Siegel-Svensson模型
17 0
|
1月前
|
机器学习/深度学习 算法 计算机视觉
利用深度学习算法实现图像风格转换技术探究
本文将通过深入分析深度学习算法在图像处理领域的应用,探讨如何利用神经网络实现图像风格转换技术。通过研究不同风格迁移算法的原理和实现方式,揭示其在艺术创作、图像编辑等领域的潜在应用和挑战。
|
2月前
|
存储 算法 搜索推荐
掌握数据结构与算法,成为技术大牛
数据结构与算法是计算机科学中至关重要的基础知识,它们的应用贯穿于各种编程语言和技术领域。本文将介绍数据结构与算法的基本概念及其在实际开发中的应用,帮助读者打下坚实的技术基础,成为真正的技术大牛。
37 4
|
2月前
|
算法 安全 Java
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
「译文」Java 垃圾收集参考手册(三):GC 算法基础篇
|
2月前
|
算法 Java
「译文」Java 垃圾收集参考手册(八):GC 算法总结
「译文」Java 垃圾收集参考手册(八):GC 算法总结
|
3月前
|
存储 安全 算法
保护数据隐私的安全加密算法:技术守护个人信息安全的利器
在数字化时代,个人信息安全日益受到威胁。本文将深入探讨安全加密算法的重要性,以及如何利用先进的技术保护个人数据的隐私。从对称加密到非对称加密,再到现代密码学的发展,我们将一一解析这些技术的原理和应用。通过了解安全加密算法,我们可以更好地保护个人数据隐私,确保信息的安全传输和存储。
63 3
|
4月前
|
编解码 算法
网易云音乐音视频算法处理技术
网易云音乐音视频算法处理技术
67 0
|
4月前
|
消息中间件 存储 算法
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
【云计算与大数据技术】数据编码LZSS算法、Snappy压缩库及分布式通信系统的讲解(图文解释 超详细)
78 0
|
1月前
|
传感器 算法 计算机视觉
基于肤色模型和中值滤波的手部检测算法FPGA实现,包括tb测试文件和MATLAB辅助验证
该内容是关于一个基于肤色模型和中值滤波的手部检测算法的描述,包括算法的运行效果图和所使用的软件版本(matlab2022a, vivado2019.2)。算法分为肤色分割和中值滤波两步,其中肤色模型在YCbCr色彩空间定义,中值滤波用于去除噪声。提供了一段核心程序代码,用于处理图像数据并在FPGA上实现。最终,检测结果输出到&quot;hand.txt&quot;文件。
|
1月前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络的视频手部检测算法matlab仿真
基于yolov2深度学习网络的视频手部检测算法matlab仿真