情况很糟糕......我必须解决这个问题5天,我无法离开。
问题:作为产品的简单操作总会导致错误的结果。为什么呢?
代码摘录:
//all vars are float
// resultVec is a vector [3]
// Rs is a vector [3]
// accelerationvalues is a vector [3]
resultVec[0]=Rs[0]*accelerationvalues[0]+Rs[1]*accelerationvalues[1]+Rs[2]*accelerationvalues[2];
//debug to print result
Log.d("e", "("+Rs[0]+")*("+accelerationvalues[0]+")+("+Rs[1]+")*("+accelerationvalues[1]+")+("+Rs[2]+")*("+accelerationvalues[2]+")="+(resultVec[0]));
这是Log Cat的结果: 但你可以简单地尝试这是错误的:在Google上搜索
(0.040147018)*(-0.9942854)+(0.9984244)*(-0.32688835)+(0.039202508)*(9.343558)
你会发现真正的结果是 8.67678679×10-9 与另一个非常不同。这个错误一直重复我执行程序,有时候差异也在标志中!
有什么问题?
我一直试着解决它! (有些发布在下面):
You can find the full source here.
P.S。此问题仅适用于resultVec[0]
和resultVec[1]
,而resultVec[2]
计算得很好。
答案 0 :(得分:2)
你是浮点数的乘法,一直累积舍入误差。使用双精度不能解决潜在的问题,即二进制计算机无法准确表示十进制浮点数。
阅读本文:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html以了解问题的概述。
您可能会发现需要使用BigDecimal类执行计算。
答案 1 :(得分:1)
这不是android的错,它是你设计应用程序的方式。
在普通的Java应用程序中执行:
public class ArithmTest {
public static void main(String[] args) {
double d1 = (0.040147018)*(-0.9942854)+(0.9984244)*(-0.32688835)+(0.039202508)*(9.343558);
System.out.println(d1);
float f1 = 0.040147018f;
float f2 = -0.9942854f;
float f3 = 0.9984244f;
float f4 = -0.32688835f;
float f5 = 0.039202508f;
float f6 = 9.343558f;
System.out.println(f1*f2 + f3*f4 + f5*f6);
}
}
如您所见,第一个与Google相同,第二个打印输出是您应用的价值。
为了解决这个问题,我认为你应该在你声明的每个变量中使用double而不是float,例如:accelerationvalues
和resultVec
。
答案 2 :(得分:0)
我认为你应该使用double类型而不是float
答案 3 :(得分:0)
您可能遇到浮点值的有限精度。为了确认这一点,您可以将float
更改为double
或使用BigDecimal
。