物理和标准::<double>numeric_limits::epsilon()...我们何时以及为什么需要它?
Physics and std::numeric_limits<double>::epsilon()...When and why do we need it?
我只是为一个相当简单的物理仿真程序编写一些代码,用户可以改变重力加速度,我想将最小重力值限制为某个值(以防止0和负重性。)。
我最终得到了这样的事情:
if(g_accel > 0.1) {
g_accel -= 0.1;
}
在程序开始时,g_accel设置为1.0。但是,它仍然允许用户在0.1以下到1.38778e-016之类的值。我对问题的解决方案是检查:
if(g_accel > 0.1+std::numeric_limits<double>::epsilon()) {
g_accel -= 0.1;
}
除了使用魔术常数外,我的问题是我不知道为什么这是必要的,而且,我真的不明白为什么Epsilon()有用或使用它是如何/何时使用的。p>我也在看一些看起来像这样的代码:
inline void Vector2D::Normalize()
{
double vector_length = this->Length();
if (vector_length > std::numeric_limits<double>::epsilon())
{
this->x /= vector_length;
this->y /= vector_length;
}
}
std :: numeric_limits :: epsilon()?
从 std::numeric_limits<T>::epsilon
上的cppReference页面上, std::numeric_limits<T>::epsilon()
返回最小的t,即 1 + std::numeric_limits<T>:epsilon()
不等于1。仅当 std::numeric_limits<T>::is_integer()
返回false时,此值才有用。该值的名称是机器Epsilon。
由于浮点数的表示形式会导致代表数字之间的差距更大,因为数字远离数字行的0,因此需要将epsilon()
的返回值缩放以与结果合作。Christer Ericson的实时碰撞检测描述了缩放背后的一些数学。他在书中提出的建议是,执行浮点相等检查时应使用的Epsilon值应该是机器Epsilon的平方根。
布鲁斯·道森(Bruce Dawson)的博客系列是我上面链接的,是了解浮点算术的复杂性的重要资源。我强烈建议您阅读该系列中的所有帖子,如果您想继续实施物理模拟。
- 何时在引用或唯一指针上使用移动语义
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 我们可以访问一个不存在的联盟的成员吗
- 何时提供默认参数作为模板参数
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 当使用透明的std函数对象时,我们还需要写空的尖括号吗
- C++-明确何时以及如何调用析构函数
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 我们可以删除链表中静态内存中的节点吗
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 为什么我们要为avl树实现返回一个指向节点的指针,而不是void函数
- 何时以及为什么我们必须使用malloc?
- 我们何时应该使用 X和X
- 我们可以使用指针和何时使用空参数
- 物理和标准::<double>numeric_limits::epsilon()...我们何时以及为什么需要它?
- 我们何时需要致电STD :: String :: latcation()
- 我们何时应该喜欢宽字符
- 即使我们有.h文件,C 何时包含CPP
- 我们何时以及为什么需要使用COM
- 在C++中使用之前,我们为什么以及何时必须初始化字符串