- 締切済み
VBAの変数の宣言で数字はすべてDoubleにする
ご意見教えてください。 VBAの変数の宣言で、数字はすべて、整数も含めてDoubleとして宣言した場合、どんな問題が考えられるでしょうか? また、実行速度が落ちるかも?しれませんが、気になるほど落ちるでしょうか
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- HohoPapa
- ベストアンサー率65% (455/693)
Long、integer型の値は Doubleが扱える範囲に全数含まれていますので Double(倍精度浮動小数点)のデータの保持方法や限界を理解し 必要な時に正しく丸め処理をすれば、 指摘のコーディングは可能ですし、正しくも動作します。 しかし、 これらを正しく理解しないで例えば次のように書くと 想定した動作になりません。 以下に示したコードは πを11倍し、そこからπを10回引き算し 更にπで割り算する計算式です。 むろん、算数的には1になる計算です。 計算結果を 一方はLong型変数に 他方をDouble型の変数に格納し比較しています。 この差がなぜ起こるのかは割愛しますが、 Double(倍精度浮動小数点)のデータの保持方法や限界がわかれば 理解できます。 常識的にも、 なにより、バグの温床になり、コードが読みにくいですから 整数しか格納しない変数の型をDoubleにすることはしません。 Sub MyTest() Dim DataL As Long Dim DataD As Double Dim DataW As Double DataW = WorksheetFunction.Pi * 11 DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataW = DataW - WorksheetFunction.Pi DataL = DataW / WorksheetFunction.Pi DataD = DataW / WorksheetFunction.Pi Debug.Print DataL Debug.Print DataD MsgBox (DataL) MsgBox (DataD) If DataL = DataD Then MsgBox "同じ" Else MsgBox "違う" End If End Sub 追記: 処理速度についてはケースバイケースと思います。 早くなるのであれば、検討の余地が出ていますが 遅くなるわけですから、検討の価値すらありません。
- unokwave
- ベストアンサー率58% (966/1654)
整数を浮動小数点で扱うと判定ミスになる場合があると言うのは、浮動小数点には有効桁数の関係で小数点以下がゼロのように見えてゼロではない状態があるからです。 整数を演算処理することなく整数だけを与えている分には問題にはなりませんが、何かから値を取り込んだり演算すると小数点以下が入る余地ができます。 実行速度は整数のほうが速いでしょうが、今時のCPUは単なる逐次処理ではありませんから、他の時間がかかる処理に紛れて差は大きくないでしょう。 この場合の「他の時間がかかる処理」はVBAというインタプリタ言語の解釈処理も含まれます。 それと整数しか受け付けない処理もありますから、浮動小数点型だけで記述するのは余計な手間がかかることになります。
- imogasi
- ベストアンサー率27% (4737/17070)
https://vbabeginner.net/vba%E3%81%AE%E6%95%B0%E5%80%A4%E5%9E%8B%E3%81%A7%E4%B8%80%E7%95%AA%E9%80%9F%E3%81%84%E3%81%AE%E3%81%AF%E3%81%A9%E3%82%8C%E3%81%8B/ VBAの数値型で一番速いのはどれか >速かった順ではInteger、Long、Currency、Double、Singleでしたが、速度の違いは微々たるものなので、そんなことは気にせず品質の高いコードを書く方がよっぽど有益、です。 IntegerとLongの差はわずかのようだ。 しかし、また >型の違いによる速度低下があったとしても、コーディングルールを適切に守りコードの品質を保つように努めた方がいいと思います。 ごもっとも。同感。 マニアックなことに首を突っこんでも、あまり良いことはないと思う。 ましてVBAをやっているレベルではね。 ーー 大小・等値 比較 整数型と倍精度浮動小数点数型を比較すると、素人に取って、予想外の結果がでて、そのままTrueやFalseに従って処理すると、大事(例ソフトのミスによる交通機関がストップのような)になりかねないと思う。プログラムの連戦錬磨の場をくぐらなけらば、ものが言えないと思う。だから当面は教科書通りの方法を勉強してはどうか。 実測結果は、例に偏りが生じやすい。もっとVBという言語の、下で支える機械語やアッセンブラーやコンパイラーの処理まで見通した人が居れば、解説できようが、こんな無料の一般質問コーナーで回答を求めても、それはかなわぬ話だ。そんなスキルの高い人が、もしこのコーナーを見ていた(ある程度継続してみていないとこの質問に出会わないのだ)ら、その人の仕事はどうなると思う?
- f272
- ベストアンサー率46% (8625/18445)
#1です。 適当な例がすぐには思い浮かばないが,例えば Sub Macro1() Dim ii As Long, ij As Long, ik As Long Dim di As Double, dj As Double, dk As Double ii = 5 di = 5 ij = 3 dj = 3 ik = ii / ij dk = di / dj Debug.Print ik Debug.Print dk End Sub
- f272
- ベストアンサー率46% (8625/18445)
数値は,整数はLong,浮動小数点数はDoubleと宣言するのがよい。 整数をDoubleにすると,整数としての正しい計算が行われません。特に比較して分岐の判断するときに違いが表れるでしょう。
お礼
回答いただきありがとうございます。 ”整数をDoubleにすると,整数としての正しい計算が行われません。”について、なぜそうなるのか教えて頂けると幸いです。
補足
回答いただきありがとうございます。 ”整数をDoubleにすると,整数としての正しい計算が行われません。”について、なぜそうなるのか教えて頂けると幸いです。