2010-02-02 67 views
2

我不知道是否有像eps这样的东西代表C++中机器精度的值?我可以使用它作为double可以表示的最小正数吗?是否可以使用1.0/eps作为double可以表示的最大正数?我在哪里可以在C++和C标准库中找到eps?机器精度

感谢和问候!


UPDATE:

对于我的目的,我想计算的权重为类似反距离加权插值(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,我希望他们的值对结果作出同样的贡献。任何想法如何实现它?

+1

你真的想要使用最大的双精度数字的重量?可能会有问题,特别是如果距离为i的多个值为0。双倍的最大值约为10^308。当距离== 0时,将wgt_tmp设置为10^150可能会更好一些,(只要其他权重比这个小得多)将具有对所有值取未加权平均值的效果,其中距离== 0 ,当存在这样的值时,或当所有距离都不为零时对所有值的加权平均值。 – 2010-02-02 16:03:16

+0

谢谢克里斯。他们是很好的建议。当存储在双重类型中的距离不是0但非常小时,它的倒数是否会超过双精度值的最大值?如果是的话,你如何检查距离是否足够小以限制其倒数? – Tim 2010-02-02 16:08:58

回答

2

这完全取决于您希望从数字中获得的精度,双数中的最大值非常大,但会遭受巨大的舍入误差。例如,如果您需要1e-3的精度,则在浮点后至少需要10位,这意味着您不应该使用大于尾数中的位数减去10的指数(如果是双精度),即52 - 10 = 42,最大值约为4e12,最小值约为2.5e-13。

3

只需要寻找numeric limits的信息?

该链接显示如何使用C++标准库查找epsilon,非规范化最小等。 C标准库中没有这些对等物。你需要自己计算它们(维基百科关于“机器epsilon”的文章举了一个例子)...

至于算法,不能帮助你,而这不是你原来的问题的一部分,抱歉。

+0

谢谢,我的问题不止于此。 – Tim 2010-02-02 16:13:08

+0

好的。当我发布这个答案时,这就是你要求的所有... – 2010-02-02 17:38:07

3

使用#include <limits>你有

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

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

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

numeric_limits

而且没有,最小正值的倒数不等于最大。

+0

谢谢,你能回答我的其他问题吗? – Tim 2010-02-02 16:12:34