情况很戏剧化..。我必须解决这个问题,已经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,这与other..This的错误是重复的,总是我执行程序,有时也有差异!!
有什么问题吗?
我一直在努力解决这个问题!(其中一些张贴在下面):
You can find the full source here.
这个问题只适用于resultVec[0]
和resultVec[1]
,而resultVec[2]
则计算得很好。
发布于 2011-11-07 17:02:42
这不是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);
}
}
正如你所看到的,第一个和谷歌一样,第二个打印输出是你的应用的价值。要解决这个问题,我认为您应该在声明的每个变量中使用double而不是float,例如:accelerationvalues
和resultVec
。
发布于 2011-11-07 11:12:55
你在把浮点数乘以,一直累积舍入误差。使用双精度并不能解决根本的问题,即二进制计算机不能准确地表示十进制浮点数。
请阅读以下文章:http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html以了解问题的概况。
您可能会发现需要使用BigDecimal类执行计算。
发布于 2011-11-07 11:07:06
我认为你应该使用双类型而不是浮点数。
https://stackoverflow.com/questions/8035566
复制相似问题