64bit変数の計算結果がおかしい

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

64bit変数の計算結果がおかしい

#1 投稿記事 by OverTaker »

64bit変数において、次のような計算をすると、なぜか10^16あたりから正しく計算できなくなってしまいます。本来valueには10^16-1が入りますが、なぜかvalueに10^16が入ってしまいます。
ActiveBasic5.0で確認しました。

コード: 全て選択

Dim value As Int64
Dim i As Long
For i = 0 To 18
	value = 10^i-1
	debug
Next
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

^演算子の実体は,basic/function.sbpにあるpow関数ではないでしょうか?
そうだとすれば,Double型で演算されて情報落ちになっているのだと思います。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#3 投稿記事 by イグトランス »

試しにOLEオートメーションのVARIANT型(内部形式:Decimal(十進小数)型)に変換し,VARIANT型の演算関数で行わせたところ正しい結果にさせることができました。
ただし,これはもはや64ビット演算ではありません。
VARIANT型はメンバ変数vtに現在保持しているデータ型を格納し,llValの部分(実際には共用体)に実際のデータを格納すると言う形式です。

また十進型はVBA 6のリファレンスで次のように説明されている型です。
10 進型 (Decimal)
10 の累乗の指数によって算出される、10 進数を格納するデータ型。小数点以下の桁数が 0 の場合 (小数部分を持たない場合)、絶対値の最大値は 79,228,162,514,264,337,593,543,950,335 です。小数点以下 28 桁の場合、絶対値の最大値は 7.9228162514264337593543950335 です。10 進型 (Decimal) で表される絶対値の最小値は、0 を除いた場合、0.0000000000000000000000000001 です。
OverTaker
記事: 231
登録日時: 2005年5月31日(火) 17:14
お住まい: 茨城県

#4 投稿記事 by OverTaker »

わざわざコードまでありがとうございます。
これを使うかはまだわからないですが、参考にさせていただきます。こちらでもいい方法を模索したいと思います。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#5 投稿記事 by イグトランス »

今更気付いたのですが,これは単にキャストすれば良かっただけのような気がします。

コード: 全て選択

Dim value As Int64
Dim i As Long
For i = 0 To 18
    value = (10 ^ i) As Int64 - 1
    debug
Next
返信する