0

情况很严重……我必须在 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这与另一个非常不同..这个错误总是重复我执行程序,有时差异也在符号上!

问题是什么?

我已经尝试了各种方法来解决它!(有些贴在下面):

你可以在这里找到完整的源代码。

  1. 将 Rs 和加速度值保存在数组列表中,并在列表器之外执行计算。没有结果。
  2. 将 float 转换为 double,没有结果。
  3. 许多其他方式

PS 这个问题只发生在resultVec[0]resultVec[1]上,而不是resultVec[2]很好的计算。

4

4 回答 4

2

您正在乘以浮点数,一直累积舍入误差。使用双精度并不能解决根本问题,即二进制计算机无法准确表示十进制浮点数。

阅读以下内容:http: //download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html以了解问题的概述。

您可能会发现需要使用 BigDecimal 类执行计算。

于 2011-11-07T11:12:55.880 回答
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.

于 2011-11-07T17:02:42.720 回答
0

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

于 2011-11-07T11:07:06.297 回答
0

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

于 2011-11-07T11:11:42.337 回答