質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

851閲覧

VBAで行う簡単な引き算の答えが合いません

P_036

総合スコア3

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2023/01/20 13:33

前提

VBAで前進消去を行うプログラムを作っているのですが、引き算の計算が合わなくて困っています。

具体的には
A=[[1, 0.2, 0.6, 1.4], [0, 1, 4.7, 2], [0, 2.8, 0.4, 5.6]]
という3,4の配列において、3行目の各列-(2行目の各列*A(3,2))を行うというごく単純なことをしたいのですが、A(3,4)-A(2,4)*2.8の計算だけが合いません。
5.6-5.6が-8.88178419700125E-16という値になってしまいます。

どうしてこんな値になるのか全く分からなくて非常に困っているため、アドバイスをしていただければ幸いです。
よろしくお願いいたします。

VBA

1 i = 3 2 pivot = A(i, 2) 3 For j = 1 To n + 1 4 A(i, j) = A(i, j) - A(2, j) * pivot 5 Next j

試したこと

A(3,4)とA(2,4)*pivotそれぞれ別個に出力して値を確認したのですが、どちらも5.6の値が出力されました。
これらを引き算するとおかしな値になってしまうという感じです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

少数の桁数が4桁以下なら、Currencyという、誤差の生じない固定小数点の型があります。
※[参考]【VBA】Currency (通貨型変数)

4桁を超えるなら、一旦整数で扱う事です。

投稿2023/01/21 03:31

編集2023/01/21 06:49
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

浮動小数点誤差と言われるものです。
VBAに限らず、プログラミング言語において小数点以下の計算を行う際絶対に誤差が生じます。
これは、2進数上では割り切れない数値(今回で言えば0.6)は近似値でしか保持できないためです。
その結果E-16(32bitならE-7)といった極限まで小さい数値の誤差が発生します。

これを回避したいならば
If(計算結果<0.001)then 計算結果=0と十分小さい値のときに明示的に0で上書きする処理が必要です。

投稿2023/01/20 13:49

pig_vba

総合スコア807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pig_vba

2023/01/20 13:57

補足 「E-16」は「10の-16乗」を意味します。つまり-8E-16とは -0.0000000000000008ということです。視覚的に見れば無視できるレベルの非常に小さな値だと分かります。
P_036

2023/01/20 13:58

回答していただきありがとうございます! 初歩的なプログラムのミスなのかと悶々としていましたが、仕様なんですね……分かりやすく原因の説明をしていただきとても助かりました…… このままの出力だとモヤモヤするので、ご助言通りにコードを書き直してみます! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問