Android(大)在浮动价值产品上失败

时间:2011-11-07 11:04:28

标签: java android math floating-point android-sensors

情况很糟糕......我必须解决这个问题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的结果: enter image description here 但你可以简单地尝试这是错误的:在Google上搜索

(0.040147018)*(-0.9942854)+(0.9984244)*(-0.32688835)+(0.039202508)*(9.343558)

你会发现真正的结果是 8.67678679×10-9 与另一个非常不同。这个错误一直重复我执行程序,有时候差异也在标志中!

有什么问题?

我一直试着解决它! (有些发布在下面):

You can find the full source here.

  1. 将ars和accelerationvalues保存在arraylist中,并在listner之外执行计算。没有结果。
  2. 将float转换为double,无结果。
  3. 许多其他方式
  4. P.S。此问题仅适用于resultVec[0]resultVec[1],而resultVec[2]计算得很好。

4 个答案:

答案 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,例如:accelerationvaluesresultVec

答案 2 :(得分:0)

我认为你应该使用double类型而不是float

答案 3 :(得分:0)

您可能遇到浮点值的有限精度。为了确认这一点,您可以将float更改为double或使用BigDecimal