代码之家  ›  专栏  ›  技术社区  ›  Tim unnamed eng

机器精度

  •  2
  • Tim unnamed eng  · 技术社区  · 15 年前

    我想知道是否有类似EPS的东西来代表C++中机器精度的价值?我可以用它作为一个双精度数所能代表的最小正数吗?是否可以使用1.0/eps作为double可以表示的最大正数?在C++和C标准库中,哪里可以找到EPS?

    谢谢和问候!


    更新:

    为了我的目的,我想计算一个权重作为距离的倒数,比如倒数距离加权插值( http://en.wikipedia.org/wiki/Inverse_distance_weighting )

    double wgt = 0, wgt_tmp, result = 0;
    for (int i = 0; i < num; i++)
    {
       wgt_tmp = 1.0/dist[i];
       wgt += wgt_tmp;
       result += wgt_tmp * values[i];
    }
    results /= wgt;
    

    然而,距离可以是0,我需要使重量适合计算。如果只有一个距离距离dist[i]为0,我希望其对应的值[i]占主导地位。如果有几个距离是0,我希望它们的值对结果的贡献相等。知道如何实现它吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   wich    15 年前

    这完全取决于您希望从数字中获得的精度,双精度中的最大值非常大,但存在巨大的舍入误差。例如,如果您需要1e-3的精度,则在浮点之后至少需要10位,这意味着您的任何指数都不应大于尾数减去10的位数,对于双精度数,也就是说,52-10=42,这样最大值约为4e12,相应的最小值约为2.5e-13。

        2
  •  3
  •   Peter Alexander    15 年前

    使用 #include <limits> 你有

    小正值= std::numeric_limits<float>::denorm_min()

    最大正值= std::numeric_limits<float>::max()

    显然,这也适用于其他类型。

    numeric_limits

    不,最小正值的倒数不等于最大值。

        3
  •  3
  •   user12345    15 年前

    只是在找 numeric limits 信息?

    该链接显示了如何使用C++标准库找到ε、非规范化Min等。在C标准库中没有与之等效的。你需要自己计算它们(维基百科关于“机器epsilon”的文章给出了一个例子)。

    至于算法,不能帮到你,这不是你原来问题的一部分,对不起。

    推荐文章