【问题标题】:FLT_EPSILON in javascript how do I translate this code?javascript 中的 FLT_EPSILON 我如何翻译这段代码?
【发布时间】: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


    【解决方案1】:

    此代码试图将angle 保持在零附近。

    但是,以这种方式管理角度很麻烦,并且需要相当小心。如果没有附带说明正在做什么、为什么以及所涉及的各种错误和规范的文档,那么它就做得不正确。

    这种角度缩减不可能在很长的变化序列中准确地保持累积变化,因为M_PI 只是 π 的近似值。因此,这种减少一般只对美学或界面效果有用。例如,当某些角度发生变化时,减少它可以防止它增长到由于浮点量化或其他计算错误而导致计算结果可能出现大幅跳跃的点,这些错误会令观看者烦恼。因此,将角度保持在零附近的区间内可以使显示看起来不错,即使它与长期实际物理学的结果有所不同。

    FLT_EPSILON 的选择似乎是任意的。 FLT_EPSILON 很重要,因为它表示 float 格式的精细度。但是,在M_PI 的量级上,float 的 ULP(最佳变化)实际上是 2*FLT_EPSILON。此外,JavaScript 使用双精度算术执行加法,FLT_EPSILON 在这种double 格式中没有特别的意义。我怀疑作者只是选择了FLT_EPSILON,因为它是一个方便的“小”号码。我希望代码能像 angle &gt; M_PI 被编写一样工作,没有任何修饰,并且 (float) M_PI 在它出现的任何地方都被更改为 M_PI。 (添加FLT_EPSILON 可能是为了给系统增加一些滞后性,这样它就不会经常在 π 附近的值和 -π 附近的值之间切换。但是,我建议的标准 angle &gt; M_PI 还包括一些具有相同的效果,尽管数量较少。对于没有浮点运算经验的人来说,这可能并不明显。)

    另外,angle = fmodf(angle, (float) M_PI); 看起来可能是一个错误,因为这是减少模 M_PI 而不是 2*M_PI,所以它会将 180º 添加到某些角度,从而产生完全不正确的结果。

    return fmod(angle, 2*M_PI); 替换整个函数体可能会令人满意。

    【讨论】:

    • 谢谢你,这很有帮助。只是一个简单的问题,我认为代码试图在 π 以上时减小角度并在 π 以下时增加角度,以便该值在 -π 到 π 的范围内,这是一个公平的说法吗?有问题的代码正在处理有关态度的信息,值应该在 -π 到 π(以弧度为单位)的范围内。
    • @Metalskin:是的,这似乎是代码的一般意图。但它不擅长。此外,如果角度必须在从接近 -π 到接近 +π 的范围内(因此接近,尽管小于 2π)是不可接受的,那么将最后的 fmod 更改为使用 2*M_PI 是不够的,因为它可以允许值最大为 2π。 fmod 必须修复,因为它的周期是错误的,但是需要做一些额外的工作才能将它从 [–2π, +2π] 减少到 [–π, +π]。
    • 感谢您的帮助埃里克。
    猜你喜欢
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多