如何在浮点和定点算法中测试数字错误
使用定点设计器™快速识别算法中的数值和索引缺陷,以便在过程早期发现错误。本视频介绍了定点和浮点的例子。它说明了如何轻松地创建一个脚本,生成反例来证明数字缺陷的存在。该视频还介绍了一个缺陷检测示例,该示例在MATLAB中集成了单元测试框架。
你是否曾被错误的数字所困扰?一个更有效的算法版本看起来很棒,但缺陷被发现得很晚,造成了大量的时间浪费。想象一下,如果在开头几分钟就找到反例来证明缺陷,会有多大的好处。
本视频将向您展示如何快速识别算法中的数字缺陷。作为第一个例子,让我们考虑将四个小数位从一个定点数中去掉并舍入到最接近的整数的目标。对于平局,目标是围拢。9.5四舍五入等于10。
受著名的浮点值舍入技巧的启发,一种高效的查找算法是加8,然后右移4位。为了验证这个算法是否正确,让我们用丰富的数字输入值对其进行实验压力测试。实验的第一步是使用数据规范提供输入属性。第二步是使用数据生成器创建数值丰富的测试输入。
最后两个步骤是标准的测试实践,得到黄金基线和新算法的输出,然后比较它们。当我们运行这个脚本时,它会立即生成反例,证明算法是有缺陷的。该算法的缺陷在于,添加8会导致8个最大输入值溢出。因为溢出位丢失了,所以随后的右移将产生零,但它应该产生2的28次方。
溢出是一个非常常见的缺陷来源。数据生成器工具确保测试输入覆盖所有极端输入组合。现在让我们考虑两个方程,它们在符号数学的理想世界中是等价的。但我们想知道它们在双精度浮点数学中是否相等。
让我们做个实验。这个脚本与第一个脚本类似,只是使用了浮点双精度浮点,并且有两个输入而不是一个。运行脚本会生成反例,证明了许多类型的缺陷。数据生成器暴露了这些缺陷,因为它聪明地测试了混乱的组合,比如NAND与无穷大的混合,以及可能溢出到无穷大的极端有限值的组合。
当将算法应用于工程应用时,输入通常有有限的范围。在这些情况下,涉及非有限值或巨大值的反例是无关的噪声。数据规范和数据生成器使应用限制和集中测试变得容易。让我们重复上一个实验,但是在- 10到+ 10的区间内使用单一精度输入。
通过两个非常简单的更改,我们可以运行脚本。它又产生了许多反例。数据生成器能够巧妙地包含将输入数据类型推到其精度极限的值,从而暴露出如下所示的缺陷。让我们来做最后一个缺陷检测实验,但有一点变化。
我们将通过结合数据生成器的强大功能和MATLAB提供的优秀单元测试框架来加强我们的游戏。该算法的目标是无损地计算一个整数矩阵中所有元素的和。要支持金宝app矩阵输入,只需向数据规范提供维度信息。
现在让我们转到命令行并运行单元测试。输出显示测试失败。还有很多点在数值上存在缺陷。现在让我们看看漏洞在哪里。在测试的算法中,我们看到了很多索引代码,每个开发人员都知道很容易搞砸索引。果然,第8行有一个索引缺陷。让我们纠正它并重新运行。
我们看到回归测试现在通过了。数据生成器的优点之一是跨输入和维度提供丰富的组合。这些丰富的组合非常善于暴露索引缺陷。数据生成器的设计是完全灵活的,支持几乎任何输入组合。金宝app
但是组合爆炸很容易失控,所以在实践中输入的维度和数量必须保持适度。数据生成器作为R 2019 b版本的定点设计器提供,在MathWorks,我们已经使用了十多年的内部版本的数据生成器。长期的经验证明,数据生成器在发现缺陷方面非常有效。我希望数据生成器将证明有利于您的工作,太。感谢收看。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。