gpt4 book ai didi

比较 C 中的 float 以进行单元测试

转载 作者:太空狗 更新时间:2023-10-29 15:18:14 24 4
gpt4 key购买 nike

所以我正在使用 CUnit 进行单元测试。我期待类似的东西

float x;
x = atof("17.99");

我想用断言来测试它;显然我可以用一些小的 epsilon

CU_ASSERT(abs(x - atof("17.99")) < epsilon);

不过我在考虑

r = atof("17.99");
CU_ASSERT(0 == memcmp(&x, &r, sizeof(float));

这似乎确实有效。我希望使用它来避免必须根据值在每个测试中手动设置 epsilon。在上述情况下,1e-6 应该足够了;但是,如果值为 1e-10,则使用 1e-6 的 epsilon 可能不会出现问题。开发人员必须做出的选择越多,出错的空间就越大。

我的问题是:这种技术在 posix 系统上应该稳定吗?也就是说,如果被比较的两个 float 是由完全相同的步骤生成的,那么它们的内部表示应该完全相同。

编辑:更重要的是,我最终想要一个 CU_ASSERT_FLOAT_EQUAL 宏。

最佳答案

比较浮点值很难。混合字符串不会让事情变得更好,当然也不会像 epsilon 那样引入少量的回旋余地。

看看这篇文章:Comparing Floating Point Numbers, 2012 Edition .对于我的钱,ULP 是必经之路。有一些令人讨厌的边缘情况,但您可能可以忽略其中的大部分。

编辑:5 月 31 日再考虑一下,我想你问的是“如果在测试函数和被测函数中使用完全相同的步骤来计算 float ,答案是否完全相同 - 所以我不不需要担心 +/- 一些小错误吗?”

答案是肯定的,它们将是相同的。但在那种情况下,您已经使单元测试变得毫无意义,因为如果被测代码中存在错误,那么同样的错误也必然会出现在测试函数中。

顺便说一下,不要因为使用 memcmp(&x, &y, sizeof(x)) 而分心。这只是测试在两个值中设置了完全相同的位。如果那是真的,那么 x == y 必然是真的。坚持 x == y。

关于比较 C 中的 float 以进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10800304/

24 4 0
文章推荐: html - 我如何设置 ul/ols 的样式以便能够灵活地环绕 float 内容?
文章推荐: android - 如何在 Rails 3 应用程序中使用 Sencha Touch 2?
文章推荐: html - 如何仅使用 html 和 css 使 显示在