【问题标题】:machine precision机器精度
【发布时间】:2011-01-12 05:16:57
【问题描述】:

我想知道是否有像 eps 这样的东西来表示 C++ 中机器精度的值?我可以将它用作双精度可以表示的最小正数吗?是否可以使用 1.0/eps 作为双精度可以表示的最大正数?我在哪里可以找到 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,我希望其对应的值 values[i] 占主导地位。如果有几个距离为 0,我希望它们的值对结果做出同样的贡献。知道如何实现吗?

【问题讨论】:

  • 您真的想使用最大的双精度数作为权重吗?可能会出现问题,尤其是当 i 的多个值的距离为 0 时。 double 的最大值约为 10^308。当距离 == 0 时,将 wgt_tmp 设置为 10^150 可能会更好,这(只要其他权重远小于此值)将对距离 == 0 的所有值产生未加权平均值的效果,当存在这样的值时,或者当所有距离都非零时所有值的加权平均值。
  • 谢谢克里斯。他们是很好的建议。当 double 类型中存储的距离不是 0 而是很小时,取其倒数会超过 double 可以表示的最大值吗?如果是,您如何检查距离是否足够小以限制其倒数?

标签: c++ c precision interpolation


【解决方案1】:

使用#include &lt;limits&gt; 你有

小正值 = std::numeric_limits&lt;float&gt;::denorm_min()

最大正值 = std::numeric_limits&lt;float&gt;::max()

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

numeric_limits

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

【讨论】:

  • 谢谢,你能试着回答我的其他问题吗?
【解决方案2】:

只是在寻找numeric limits 的信息?

该链接显示了如何使用 C++ 标准库查找 epsilon、非规范化最小值等。在 C 标准库中没有对应的这些。您需要自己计算它们(关于“机器 epsilon”的 Wikipedia 文章给出了一个示例)...

至于算法,无法帮助您,这不是您最初问题的一部分,抱歉。

【讨论】:

  • 谢谢,我的问题不止于此。
【解决方案3】:

这完全取决于您希望数字的精度,双精度的最大值非常大,但会出现巨大的舍入误差。例如,如果您需要 1e-3 的精度,则在浮点数之后至少需要 10 位,这意味着在双精度的情况下,您不应该有任何大于尾数中的位数减去 10 的指数,即52 - 10 = 42,留下的最大值约为 4e12,相应的最小值约为 2.5e-13。

【讨论】:

    猜你喜欢
    • 2011-12-21
    • 2015-04-06
    • 1970-01-01
    • 2022-12-21
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    相关资源
    最近更新 更多