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);
替换整个函数体可能会令人满意。
- 问号在这段代码中是什么意思
- 我怎样才能用速记函数来写这段代码
- 这段代码的含义是什么<%=一些可变的%>
- 为什么这两段代码返回的值不同
- 如何重复某段代码
- Mozilla并没有完美地执行这段代码,尽管它适用于Chrome和IE
- 这段代码的含义是什么 'start = +start ||0;' 在 JavaScript 中
- Eloquent JS第5章中的这段代码是做什么的
- JQuery:这段代码是什么意思
- 这段代码中发生了什么
- 这段代码有什么问题(responsible html-css-js)
- 嵌套if语句中的else语句.这段代码如何知道要执行哪个else语句
- 这段代码的语法是什么
- 在这段代码中:为什么e被定义在定义e的括号中
- JavaScript-为什么这段代码不起作用
- javascript去模糊处理-这段代码的作用
- 如何重写这段代码,使执行不必从Javascript Promise.then()方法开始
- 如果没有jQuery,这段代码的并行性是什么
- 为什么这段代码会导致使用phantom模块的Node.js挂起
- FLT_EPSILON在javascript我如何翻译这段代码