std::numeric_limits<double>::epsilon() 可以用来做什么?
What can std::numeric_limits<double>::epsilon() be used for?
unsigned int updateStandardStopping(unsigned int numInliers, unsigned int totPoints, unsigned int sampleSize)
{
double max_hypotheses_=85000;
double n_inliers = 1.0;
double n_pts = 1.0;
double conf_threshold_=0.95
for (unsigned int i = 0; i < sampleSize; ++i)
{
n_inliers *= numInliers - i;//n_linliers=I(I-1)...(I-m+1)
n_pts *= totPoints - i;//totPoints=N(N-1)(N-2)...(N-m+1)
}
double prob_good_model = n_inliers/n_pts;
if ( prob_good_model < std::numeric_limits<double>::epsilon() )
{
return max_hypotheses_;
}
else if ( 1 - prob_good_model < std::numeric_limits<double>::epsilon() )
{
return 1;
}
else
{
double nusample_s = log(1-conf_threshold_)/log(1-prob_good_model);
return (unsigned int) ceil(nusample_s);
}
}
下面是一个选择语句:
if ( prob_good_model < std::numeric_limits<double>::epsilon() )
{...}
据我了解,判断陈述与(或近似)相同
prob_good_model < 0
那么我是否正确,除此之外std::numeric_limits<double>::epsilon()
在哪里可以使用?
epsilon 的目的是让你(相当)容易地找出两个数字之间可以看到的最小差异。
不过,您通常不会完全按原样使用它。您需要根据要比较的数字的大小来缩放它。如果你有两个大约 1e-100 的数字,那么你会使用以下顺序:std::numeric_limits<double>::epsilon() * 1.0e-100
作为比较标准。同样,如果你的数字在 1e+100 左右,你的标准将是std::numeric_limits<double>::epsilon() * 1e+100
.
如果您尝试在不缩放的情况下使用它,您可能会得到严重错误(完全无意义)的结果。例如:
if (std::abs(1e-100 - 1e-200) < std::numeric_limits<double>::epsilon())
是的,这将显示为"真实"(即说两者相等),即使它们相差 100 个数量级。在另一个方向上,如果数字远大于 1,与(未缩放的)epsilon 相比相当于说if (x != y)
- 它根本没有四舍五入误差的空间。
至少根据我的经验,为浮点类型指定的epsilon
通常没有多大用处。通过适当的缩放,它会告诉您给定幅度的两个数字之间可能存在的最小差异(对于特定的浮点实现)。
然而,在实际使用中,实际用途相对较少。更实际的数字通常基于输入的精度,以及由于四舍五入(等)而可能丢失的精度量的估计值。
例如,假设您从测量精度为百万分之一的值开始,并且您只进行了几次计算,因此您认为由于舍入误差,您可能损失了多达 2 位精度。在这种情况下,你关心的"epsilon"大约是1e-4,根据你正在处理的数字的大小。也就是说,在这种情况下,您可以期望 4 位精度量级是有意义的,因此如果您看到前四位数字的差异,则可能意味着值不相等,但如果它们仅在第五位(或更晚)位不同,您可能应该将它们视为相等。
事实上,你使用的浮点类型可以表示(例如)16位精度并不意味着你使用的每个测量值都会接近精确 - 事实上,基于物理测量的任何值都有希望接近这个精度是相对罕见的。但是,它确实限制了您可以从计算中获得的期望 - 即使您从一个精确到30位的值开始,计算后您可以希望的最大值将由std::numeric_limits<T>::epsilon
定义。
它可以用于未定义函数的情况,但此时您仍然需要一个值。你会失去一点准确性,尤其是在极端情况下,但有时没关系。
比如说,你在某处使用1/x
,但 x 的范围是 [0, n[.你可以改用1/(x + std::numeric_limits<double>::epsilon())
,以便仍然定义 0。话虽如此,您必须小心如何使用该值,它可能不适用于每种情况。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 警告处理为错误这里有什么问题
- 什么时候调用组成单元对象的析构函数
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 什么时候在C++中返回常量引用是个好主意
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- C++避免重复声明的语法是什么
- c++库的公共头文件中应该包含什么
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- ifstream什么都没读
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 什么是模板&lt;&gt;inline bla bla
- 使用 std::vector<boost::shared_ptr<Base_Class>> 或 boost::p tr_vector 的性能注意事项是什么<Base>