Androidアプリ開発

浮動小数点演算の誤差対応
BigDecimal

この記事は約7分で読めます。
記事内に広告が含まれています。
スポンサーリンク

この記事は Androidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Java での開発経験、XML構文規則、Android のアプリ開発経験がある方を対象としています。
Android のアプリ開発でお役にたててれば、嬉しいです。
(これから Android のアプリ開発や Java での開発を始めたい方への案内は、
記事の最後で紹介します)

この記事のテーマ


浮動小数点演算で誤差が発生しないように正確な演算結果を得る

計算に特化したコンピュータといえば電卓、デスクに1台欲しいですね!

ポイント

小数点以下の数値を含む演算での数値は2進数で表現され、演算自体も2進数で行います。
2進数で表現できない数値は近似値で扱われ、これが誤差が生じる原因です。
小数点以下の誤差を許容できい場合は任意精度の符号付き10進数を扱えるBigDecimalを使用します。
今回はBigDecimalを使用して、有効桁数の範囲で誤差が発生しない演算の実装について説明します。

BigDecimal

サンプルはGPS位置情報(緯度・経度)を引数(adjust)で位置を移動させるコードです。
緯度・経度の位置を約40㎝のメッシュで管理する場合、小数点以下6桁の数値となります。
緯度・経度を約40cm移動する場合、引数(adjust)に0.000001をセットします。
この演算をdoubleで演算すると、丸め誤差によって正確な演算結果が得れません。
演算する数値をBigDecimalでインスタンス化し、addで加算します。

    private ArrayList<String>           arrayLogs;
    :
    private void moveArrayLogs(String[] adjust) {
        ArrayList<String>   arrayList = arrayLogs;
        BigDecimal[]    bd2 = {new BigDecimal(adjust[0]), new BigDecimal(adjust[1])};
        double[]    gy = {0};
        String[]    data;
        arrayLogs = new ArrayList<>();
        for (int i = 0; i < arrayList.size(); i++) {
            data = arrayList.get(i).split("\t");
            BigDecimal[] bd1 = {new BigDecimal(data[1]), new BigDecimal(data[2])};
            BigDecimal[] pos = {bd1[0].add(bd2[0]), bd1[1].add(bd2[1])};
            :
            arrayLogs.add(String.format(Locale.getDefault(), "%s\t%.7f\t%.7f\t%s\t%s\t%s\t%s\t%s\t%s\t%s", data[0], pos[0].doubleValue(), pos[1].doubleValue(), data[3], data[4], data[5], data[6], data[7], data[8], data[9]));
        }
        :
    }
    :

arrayLogsは緯度・経度を含むタブ区切りの文字列配列です。
サンプルではarrayLogsに演算結果を反映しています。

今回は、ここまでです。

浮動小数点演算の誤差対応しているAndroidアプリです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちらから、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

ブログランキング・にほんブログ村へ

これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

アプリケーション開発経験がない方や、アプリケーション開発経験がある方でも、Java や C# などのオブジェクト指向言語が初めての方は、Android のアプリ開発ができるようになるには、かなりの時間がかかります。
オンラインスクールでの習得を、強くおススメします。

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました