姿勢制御用の PMP に関連するいくつかの C++ コードを翻訳しており、コードの一部でFLT_EPSILON
.
コードは次のことを行います。
while (angle > ((float)M_PI+FLT_EPSILON))
M_PI
は簡単ですが、何をすればよいかわかりませんFLT_EPSILON
。グーグルは私に言った:
これは、1 と、1 より大きい float 型の最小の浮動小数点数との差です。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 を y で割った浮動小数点の余りを計算します。戻り値は x - n * y です。ここで、n は x / y の商であり、ゼロに向かって整数に丸められます。