当前位置: 首页 > 知识库问答 >
问题:

浮点等式和公差

水恩
2023-03-14

通过类似于a_float==b_float的方式比较两个浮点数会带来麻烦,因为由于舍入错误,a_float/3.0*3.0可能不等于a_float

一个人通常做的事情类似于fabs(a_float-b_float)

如何计算tol?

理想情况下,公差应该仅仅大于一两个最不重要数字的值。因此,如果单精度浮点数是使用tol=10E-6应该是正确的。然而,这对于a_float可能非常小或可能非常大的一般情况并不适用。

如何正确计算所有一般情况下的tol?我对C或C类案例特别感兴趣。


共有3个答案

傅奕
2023-03-14

C头文件

#include <float.h>
#ifndef DBL_TRUE_MIN
/* DBL_TRUE_MIN is a common non-standard extension for the minimum denorm value
 * DBL_MIN is the minimum non-denorm value -- use that if TRUE_MIN is not defined */
#define DBL_TRUE_MIN DBL_MIN
#endif

/* return the difference between |x| and the next larger representable double */
double dbl_epsilon(double x) {
    int exp;
    if (frexp(x, &exp) == 0.0)
        return DBL_TRUE_MIN;
    return ldexp(DBL_EPSILON, exp-1);
}

江宏深
2023-03-14

据我所知,一个没有。

没有通用的“正确答案”,因为它可能取决于应用程序对精度的要求。

例如,在屏幕像素中工作的2D物理模拟可能决定1/4像素就足够了,而用于设计核电厂内部构件的3D CAD系统可能就不够了。

我看不到从外部以编程方式决定这一点的方法。

韦高阳
2023-03-14

这篇博文包含了一个例子,相当简单的实现,以及背后的详细理论http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/它也是一个系列中的一个,所以你可以随时阅读更多。简而言之:对大多数数字使用ULP,对接近零的数字使用epsilon,但仍有一些注意事项。如果你想确定你的浮点数学,我建议你阅读整个系列。

 类似资料:
  • 众所周知,在比较浮点值时必须小心。通常,我们不使用,而是使用一些基于epsilon或ULP的相等性测试。 然而,我想知道,当使用时,是否存在任何情况? 看看这个简单的片段,哪些案例可以保证成功? 注意:我已经检查了这个和这个,但是它们不包括我的(所有)病例。 注2:似乎我必须添加一些附加信息,因此答案在实践中可能很有用:我想知道: C标准的内容 这是我在当前标准草案中发现的唯一相关声明: 浮点类型

  • 问题内容: 众所周知,即使是十进制格式的小数点后有固定数字的浮点数也无法准确表示。因此,我有以下程序要测试: 输出如下: 我无法从上述结果中回答两个问题,我正在寻求以下方面的帮助: 为什么使用的双重表示形式,并且看起来很精确,而没有。 为什么返回true? 问题答案: 我怀疑在这里不能正常工作。写入0.1时,获取确切值的一种可靠方法是write 。 “为什么0.1f + 0.2f == 0.3f返

  • 众所周知,浮点数,即使是小数点后固定数字的十进制格式,也不能准确表示。所以我有以下程序要测试: 输出如下: 以上结果中有两个问题我无法回答,我正在寻求帮助: 为什么0.1、0.2和0.3的双重表示看起来很精确,而0.1、0.2却不精确。

  • 问题内容: 我有一段代码的行为会有所不同,具体取决于我是通过字典获取转换因子还是直接使用它们。 以下代码将打印 但是,如果你更换用,并用它将打印 首先让我说我很确定这里发生了什么。我以前在C中看到过它,但是在Python中却从未见过,但是自从Python在C中实现以来,我们已经看到了它。 我知道浮点数将更改从CPU寄存器到缓存以及返回的值。我知道比较两个相等的变量应该返回false,如果其中一个被

  • 我想对无序的复杂浮点数组进行鼻子测试。 例如,如果 和 断言应该成功,因为它们具有大致相同的值和相同的次数。顺序无关紧要。 对于常规浮点数,很好,但这在这里不起作用,因为它首先按实部排序,然后按虚部排序,因此由于浮点数错误,它们被排序为: 有没有内置的方法可以做到这一点?如果没有,我想我可以求助于类似cplxreal的东西,但这似乎需要添加到测试文件中。

  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?