• ベストアンサー

variant型にした場合、精度は落ちるのでしょうか?

スピードや.NETに移行する場合は、currency型のままで良いのはわかりますが、より広い型を扱うようにバリアント型にしました。 同じようにint, long, single, double, currency型のデータをvariant型にして計算した場合の精度について詳しい方、教えてください。 また、COM+でVARIANT型みたいなのがあるようですが、VBのバリアントと同じものなのでしょうか?

  • hdkoa
  • お礼率0% (1/117)

質問者が選んだベストアンサー

  • ベストアンサー
  • s-matu
  • ベストアンサー率20% (1/5)
回答No.3

回答2の方がおっしゃるとおり、計算に使用する値や変数の型によります。 例えば、 Dim varVal1 as Variant varVal1 = 1! / 3! '結果はSigle型精度 varVal1 = varVal1 / 3# '結果はDouble型精度 varVal1 = varVal1 + 2@ '結果はCurrency型精度 varVal1 = varVal1 / 3# '結果はDouble型精度 となります。 誤差とかも結果の型と同じように発生します。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

再度質問しているようだが、 http://hp.vector.co.jp/authors/VA021605/vb/Dimension.htm のVariant型の解説を読めばわあるように >(1)精度について 論じる視点軸とと、データ型が当初決めないという性格と、視点軸があってないのを質問していると思いませんか。 (2)メモリを沢山消費する、(3)ミクロ的にスピードが落ちる とかの視点軸で論じられるが、精度では論じられない(意味が無い)。 代入の右辺に来た変数の型に従います、ということではないですか。 右辺にはVBで認められる型=精度も決まっている、しか来ないのではないですか。 それにVatiant型は勧められていないようだから、余り詮索する必要も無いと思う。 http://iijima.auemath.aichi-edu.ac.jp/pw/programming/pukiwiki.php?VB6%A4%AB%A4%E9VB2005%A4%D8 >variant型から, 型の明示へ ーー まあ他の方の良い回答があればよいが。 やや難しい質問の場合、プロ級の方に見てもらわないとダメなので、土日休日に質問を出すのは得策じゃないように経験から思う。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

多分、Variant型にしたからといって、単純な計算なら演算精度が落ちる事はないと思います…型宣言付きの変数で演算した場合と比べて Variant型は保持しているデータの型を取得できるので、型宣言付きの時と同じく適切に型変換されてから演算時が実行される事を期待できます 注意しないといけないのは、暗黙の変換が行われる場合ではないでしょうか? a="0.1" a=a*2 の結果は、Double型で0.2になります(多分) 精度(誤差)を気にしてCurrency型で演算する/結果が欲しいなら a=ccur(a)*2 みたいにしないとだめですよね?(Currency*Integerとして計算させる) …ここでは、aに"0.1"という文字列が入っているので、ccur()で誤差はでないはず a=ccur(a*2)にしても結果はCurrency型になりますが、チョット意味が違うってのはわかりますよね ぁ、割り算のほうが例としては良かったかも

関連するQ&A

  • InputBox  String型・Variant

    VBAです。 InputBox  String型・Variant型がエラーにならない理由がわかりません。 Sub 日付型() Dim 日 As Date 日 = InputBox("値をいれてください") End Sub Sub 数値型() Dim i As Long i = InputBox("値をいれてください") End Sub Sub 通貨型() Dim 円 As Currency 円 = InputBox("値をいれてください") End Sub Sub String型() Dim a As String a = InputBox("値をいれてください") End Sub Sub Variant型() Dim v As Variant v = InputBox("値をいれてください") End Sub String型・Variant型以外は、 「実行時エラー '13'; 型が一致しません。」になります。 String型・Variant型はならない理由を教えてください。ご回答よろしくお願いします。

  • エクセルVBAで16の16乗を正確にさせるには?

    エクセルVBAにて16の16乗を取り扱いたいのですが.... データ型が、LongとCurrencyでは、オーバーフローしてしまいます。 そこで、SingleとDuobleですると   Singelでは、1.844674E+19   Doubleでは、1.84467440737096E+19 になります。 これを、正確に18446744073709551616とさせる方法を教示ください。 Dim Dec_data As Double Dec_data = 16 ^ 16 MsgBox Dec_data

  • VBAのsingle,doubleのデータ型のE+,E-

    VBAのデータ型longやsingleの E+やE-は何を表しているのでしょうか? 単精度浮動小数点型 3.4028235E+38~などです。 また、single doubleはそれぞれ-3.4028~、-1.797~ などと書いてありますが、1万台で小数点以下の数値がある値、たとえば17,562.256はどのデータ型を使えばよいのでしょうか?

  • 小数の計算の精度について

    Perlでプログラムを作成しているのですが、小数の乗算を行う際に、計算が合わなくなって困っています。 例: 10000*1.005=10049 コンピューターの性質上、小数の乗算等は精度に問題があるのは分かっているのですが。 VB等では変数の型をうまく設定すれば計算出来るのですが、Perlではどのような方法でこの現象を回避できるのでしょうか。 もし、よい知恵がありましたらよろしくお願いします。

    • ベストアンサー
    • Perl
  • この画像はphpの画像なんですが、なぜ小数0.12

    この画像はphpの画像なんですが、なぜ小数0.123がdouble型と表示されているんでしょうか? single, double, long doubleなどが値が小数の場合の型なんですよね? その中のdoubleが出力されている理由はなんでですか?

    • ベストアンサー
    • PHP
  • 型について

    Cの型の中にint と long int がありますけどこの違いは何なのでしょうか?本にはどちらも4ビットの整数(long intは長整数となっていますが)-2147486648~2147483647となっていますが・・。 同様にdouble と long double は何が違うのでしょうか? 初歩的なところですがよろしくおねがいします。

  • .Netのデータ型

    ちょっと前の記事の確認です。ちなみに記事はこちらです。 http://www.atmarkit.co.jp/fdotnet/vb6tonet2/vbnet2_02/vbnet2_02_01.html .NetではVariant型が廃止されてObject型に移行になってます。 その上の記事に例えばLongはSystem.Long構造体のエイリアスと書いてあります。 この2つの出来事からいえることはLongやIntegerといったお馴染みのデータ型も 実はオブジェクトになったのではないかということです。 それならばVariant型がObject型に移行しても納得できます。 常日頃からこう思っているのですが、実際はどうなのでしょうか?

  • 変数について

    質問1:-0.0685274635この数値を扱うのは(計算したりIFで判断するには)どの変数を使えば良いですか? '変数 Variant Double=倍精度浮動 Currency=通貨型 Integer=整数型 Float=浮動小数点型 Long=長整数型 Dim CAL_DA As Integer Range("A1")="-0.0685274635" CAL_DA =Range("a1") 質問2:CAL_DAが-6.85274..になってしまいます。 ただし、必要とするのは-0.068の桁でよいのですが 質問3:CAL_DA =Mid(Range("a1"),1,6)いけますか? 以上ですよろしくお願いします。

  • C/C++の型について

    Windows2000で、VC++6で型のサイズを調べると、以下のとおりでした。 int 4バイト long 4バイト long int 4バイト 環境はWindows2000, CPUはCeleron1200Mhzです。 環境やコンパイラによって型のサイズや呼び方も変わるのでしょうか? VisualBasic6用のDLLをVCで作成した記憶があるのですが、そのときは VB6のInteger型が2バイトだったので C(Ver7.0?????)側も2バイトだったと思います。 今VB6のInteger型にあわせる場合はC側ではshortでないとおかしくなるのでしょうか? 私はブランクがあり、そのあたりの事情がよくわかっていません。 あるサイトのページを見ると intが2バイトで、 long intは同じ4バイトで long long intという型もありました。VC6++では long long intは無いようです。 http://seclan.dll.jp/c99d/c99d05.htm VC2005++やGCCでは8バイトの型はあるのでしょうか?

  • VC6でALTを作成して、VB6やC#で利用する場合の型の定義の仕方

    COM+の引数や型で悩んでいます。 ALTで型が標準(intなど)でないとコンパイルエラーになると解釈して、 型をユーザー定義型(構造体)にしてデータのやり取りをすれば、どんな引数でも送れると思いました。 そして、その際にはポインタ(4バイト)が使われると仮定して、引数をint datとまるで4バイトの数値のようにしました。 (大丈夫か?) そのポインタを受け取り後、構造体のポインタキャストを当てて、ポインタの中身にアクセスできるようにしました。 このようにすると、コンパイルとするとエラー無しになり、戻り値も正しく返されて、これでいけると思ったのですが、 一部望み通りでない結果が出ました。 通常、ポインタで渡された場合、そのポインタを使って中身(ここではc)を変えた場合、反映されるはずでしたが 戻り値とcの値が異なったため、このやり方は正しくないのではないかと思いました。 ALTに詳しい方、以下のやり方のどこが間違っているのでしょうか? まったく分からないまま、VC6でALTを作成してVisualBasic6でテストしました。 まず、VC6でTest1は、 [in] int dat, [out,retval] int* retval 定義は struct S1 int a[10]; int b[10]; int c; } STDMETHODIMP CTest::Test1(int dat, int *retval) { S1* data = (S1 *)dat; data->c = data->a(0) + data->b(0); // ここでは3になっている。 *retval = data->c; return S_OK; } としてできたDLLをVBの参照設定で取得して呼び出した場合 type S1 a(10) as long b(10) as long c as long end type dim x as S1 x.a(0) = 1 x.b(0) = 2 dim dmy as variant dmy = test.Test1( varptr(x) ) dmy値は3で、x.cの値は3ではありませんでした。 int型など一般的な型やユーザー定義型などを引数として解説しているATLの本など ご存知の方、押してください。

専門家に質問してみよう