【发布时间】:2012-06-03 17:52:38
【问题描述】:
所以我使用 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 系统上应该稳定吗?也就是说,如果被比较的两个浮点数是由完全相同的步骤生成的,那么它们的内部表示应该完全相同。
编辑:更重要的是,我最终想要一个 CU_ASSERT_FLOAT_EQUAL 宏。
【问题讨论】:
-
是的,如果它们是由相同的步骤生成的,它们的表示将是相同的。除非结果是 NaN,否则您将拥有
x == y。 -
memcmp()解决了哪些简单的==无法解决的问题? -
@DanielFischer:可以保证吗?我认为是,但是潜在的编译器优化(宽浮点寄存器中的中间结果等)呢?
-
@mouviciel:对于浮点类型,使用 == 不起作用,即使具有相同的表示。见dl.acm.org/citation.cfm?id=103163
-
@MichaelConlen 有了同样的表示,你肯定会得到
==是真的,除非你和NaN混在一起。
标签: c floating-point arithmetic-expressions