FLT_EPSILON在javascript我如何翻译这段代码
FLT_EPSILON in javascript how do I translate this code?
我正在翻译一些与姿态控制的PMP相关的c++代码,部分代码使用FLT_EPSILON
。
代码执行以下操作:
while (angle > ((float)M_PI+FLT_EPSILON))
M_PI
是简单的,但我不确定什么与FLT_EPSILON
。谷歌告诉我:
表示1和最小浮点数之间的差值float类型大于1的个数。应该是否定的
然而,其他来源的状态值,如1.192092896e-07F
。
我不是百分之百清楚为什么它被使用。我怀疑这与浮子的粒度有关。因此,如果有人能澄清它在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;
}
—edit—
刚刚意识到fmodf没有定义。显然,它是一个lib函数,并执行以下操作:
fmod()函数计算除法的浮点余数返回值是x - n * y,其中n是x/的商Y,向零四舍五入为整数。
这段代码试图将angle
保持在0附近的间隔内。
然而,以这种方式管理角度是麻烦的,需要相当小心。如果没有文档来解释做了什么,为什么做,以及所涉及的各种错误和规范,那么它就做得不正确。
由于M_PI
只是π的近似值,这种角度的减小不可能在长变化序列中准确地保持累积变化。因此,这种减少通常只对美观或界面效果有用。例如,当某个角度发生变化时,减小它可以防止它增长到由于浮点量化或其他计算错误而导致计算结果出现大跳跃的程度,这将使观看者感到厌烦。因此,保持角度在零附近的间隔内会使显示看起来很好,即使它偏离了长期的实际物理效果。
FLT_EPSILON
的选择似乎是任意的。FLT_EPSILON
很重要,因为它表示float
格式的精细性。然而,在M_PI
的量级下,float
的ULP(最小变化)实际上是2*FLT_EPSILON
。此外,JavaScript用双精度算法执行加法,FLT_EPSILON
在double
格式中没有特别的意义。我怀疑作者选择FLT_EPSILON
只是因为它是一个方便的"小"数字。我希望这段代码可以像没有修饰的angle > M_PI
一样工作,并且(float) M_PI
在任何地方都被更改为M_PI
。(FLT_EPSILON
的加入可能是为了给系统增加一些滞后,这样它就不会经常在π附近的值和-π附近的值之间切换。然而,我建议的标准angle > M_PI
也包括一些相同的效果,尽管数量较少。对于没有浮点运算经验的人来说,这可能不太明显。)
另外,看起来angle = fmodf(angle, (float) M_PI);
可能是一个bug,因为这是减少M_PI
而不是2*M_PI
的模,所以它会在某些角度增加180º,产生完全不正确的结果。
用return fmod(angle, 2*M_PI);
替换整个函数体可能会令人满意。
- 在java中解决这段代码时面临循环中的问题
- 我是如何在这段代码中出现分段错误的
- 我不明白这段代码是如何对这个pythonlist()进行排序的,也不明白如何用C++中的向量来重现它
- 为什么这段代码不起作用,我该如何解决?
- 为什么这段代码给我错误? 有没有自错?
- 有人可以解释一下这段代码如何能够反转字符串
- 可能我知道为什么这段代码没有给出任何输出吗?
- 这段代码的最后一行在做什么?
- 我不知道为什么这段代码会让核心被转储?
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 有人可以向我解释一下这段代码的作用吗?
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 为什么这段代码会导致无限循环?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 如何为一段代码启用 -permissive
- 谁能告诉我为什么这段代码没有产生正确的输出?
- 我想反转我的阵列.为什么这段代码给出垃圾值?
- 使用Qt Creator在调试模式下编译一段代码
- 这段代码到OpenCV Java的翻译是什么?
- FLT_EPSILON在javascript我如何翻译这段代码