【发布时间】:2023-03-16 17:54:01
【问题描述】:
我正在翻译一些与 PMP 相关的 c++ 代码,用于姿态控制,部分代码使用FLT_EPSILON。
代码执行以下操作:
while (angle > ((float)M_PI+FLT_EPSILON))
M_PI 很简单,但我不确定FLT_EPSILON 的用途。谷歌告诉我:
这是1和最小浮点数的差 大于 1 的类型浮点数。它应该是 no 大于 1E-5。
但其他来源声明值,例如 1.192092896e-07F。
我不是 100% 清楚为什么要使用它。我怀疑这与浮动的粒度有关。因此,如果有人可以澄清它试图在 C++ 中做什么,并且如果这是 javascript 的一个问题,那将非常有帮助。
我不确定 javascript 如何在内部处理这些值之类的内容,因此我们将不胜感激。
作为一个仅供参考,我正在翻译的代码如下(来自 QGroundControl,它是开源的):
float limitAngleToPMPIf(float angle) {
if (angle > -20*M_PI && angle < 20 * M_PI) {
while (angle > ((float)M_PI + FLT_EPSILON)) {
angle -= 2.0f * (float)M_PI;
}
while (angle <= -((float)M_PI + FLT_EPSILON)) {
angle += 2.0f * (float)M_PI;
}
} else {
// Approximate
angle = fmodf(angle, (float)M_PI);
}
return angle;
}
--- 编辑---
刚刚意识到 fmodf 没有定义。显然它是一个 lib 函数并执行以下操作:
fmod() 函数计算除法的浮点余数 x x y。返回值为 x - n * y,其中 n 是 x / y,向零舍入为整数。
【问题讨论】:
标签: javascript c++ floating-point pi