[英]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。假定它不大於1E-5。
但是其他來源聲明的值如1.192092896e-07F
。
我不清楚為什么要使用它。 我懷疑這與float的粒度有關。 因此,如果有人可以弄清它在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的商,朝零舍入為整數。
該代碼試圖將angle
保持在零附近的區間內。
然而,以這種方式管理角度是麻煩的,並且需要相當的小心。 如果沒有隨附說明正在執行的操作,原因以及所涉及的各種錯誤和說明的文檔,則說明操作不正確。
由於M_PI
只是π的近似值,因此這種角度減小不可能在長時間的變化序列中准確地保持累積的變化。 因此,這種減少通常僅對美學或界面效果有用。 例如,隨着某些角度的變化,減小角度可以防止其增長到可能由於浮點量化或其他煩人的計算錯誤而導致計算結果出現較大跳躍的點。 因此,將角度保持在零附近的區間內會使顯示效果看起來不錯,即使它與長期的實際物理效果有所不同。
FLT_EPSILON
的選擇似乎是任意的。 FLT_EPSILON
對於表示float
格式的精細度很重要。 然而,在幅度M_PI
,一個的ULP(最好變化) float
實際上是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);
可能是一個錯誤,因為這會減少M_PI
模數,而不是2*M_PI
模數,所以它將對某些角度增加180º,從而產生完全錯誤的結果。
有可能用return fmod(angle, 2*M_PI);
替換整個函數體return fmod(angle, 2*M_PI);
會令人滿意地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.