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

浮動小数点数を乗算し、丸め誤差を累積しています。倍精度を使用しても、バイナリ コンピューターが 10 進浮動小数点数を正確に表現できないという根本的な問題は解決されません。

問題の概要については、 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のものと同じで、2番目のプリントアウトはアプリの価値です。これを解決するには、宣言したすべての変数でfloatの代わりにdoubleを使用する必要があると思います(例:accelerationvaluesおよび。) resultVec

于 2011-11-07T17:02:42.720 に答える
0

float の代わりに double 型を使用する必要があると思います

于 2011-11-07T11:07:06.297 に答える
0

浮動小数点値の精度の限界に直面している可能性があります。これを確認するには、 を に変更するfloatdouble、 を使用しますBigDecimal

于 2011-11-07T11:11:42.337 に答える