用浮点数做数学时,我得到了一个令人困惑的结果.我的代码永远不会产生负数,产生负数,当我尝试取平方根时会导致NaN.
此代码似乎在测试中非常有效.然而,当在真实世界(即可能非常小的,七个和八个负指数)数字上操作时,最终总和变为负,导致NaN.理论上,减法步骤只删除已添加到的数字sum; 这是一个浮点错误问题吗?有没有办法解决它?
代码:
public static float[] getRmsFast(float[] data, int halfWindow) {
int n = data.length;
float[] result = new float[n];
float sum = 0.000000000f;
for (int i=0; i<2*halfWindow; i++) {
float d = data[i];
sum += d * d;
}
result[halfWindow] = calcRms(halfWindow, sum);
for (int i=halfWindow+1; i<n-halfWindow; i++) {
float oldValue = data[i-halfWindow-1];
float newValue = data[i+halfWindow-1];
sum -= (oldValue*oldValue);
sum += (newValue*newValue);
float rms = calcRms(halfWindow, sum);
result[i] = rms;
}
return result;
}
private …Run Code Online (Sandbox Code Playgroud)