Qwordについて(10進数,2進数の変換)

ActiveBasicのバグと思われる不具合を発見された方は、こちらから知らせていただけると助かります。
返信する
メッセージ
作成者
faro

Qwordについて(10進数,2進数の変換)

#1 投稿記事 by faro »

2つバグらしいものを発見しましたので報告します。

10進数から2進数に変化するプログラムですが,
メインプログラムで,qword宣言でinputを使用すると,入力後のデータ(ii)がゼロになってしまいます。dword宣言にするときちんと代入されます。

また,適当な10進数を2進数に変化する場合,ii=1108099398の場合きちんと計算されますが,ii=41467157163の場合計算されません。Dec2Bin関数内でデバックしたところ,data3の値がおかしいようです。

どなたかコメントお願いします。

環境:xp/sp2 + AB4.13 及び AB4.2 で確認しています。

'************** MAIN Prgram **************
#console
dim ii as qword
dim temp$ as string

'input ii

''ii=41467157163
ii=1108099398

print ii
temp$=Dec2Bin(ii)

print temp$,Bin2Dec(temp$)

end


'**************************************************
Function Dec2Bin(ByVal data As qword) As String

Dim data2 As String
dim data3 as qword

data3=data
Do
'print "DebugWrite ",data3,(data3 mod 2)

If (data3 mod 2) = 0 Then
data2 = "0" + data2
Else
data2 = "1" + data2
End If

data3=Int(data3/2.0)

Loop Until data3=0

Dec2Bin = data2

End Function

'**************************************************
Function Bin2Dec(ByVal data As String) As string

Dim data2 As qword
dim c as qword
dim temp2$ as string
dim i2 as qword

data2=0
i2=0

c=Len(data)
Do
i2=i2+1
c=c-1
temp2$=Mid$(data,i2,1)

data2=data2+(2.0^c)*Val(temp2$)
Loop Until c=0

Bin2Dec = Str$(data2)

End Function
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

Re: Qwordについて(10進数,2進数の変換)

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

> data3 = Int(data3 / 2.0)
これをdata3 = data >> 1或いはdata3 = data \ 2にしてみてください。
QWord型やInt64型の大きな値は浮動小数点数型のDoubleでは全ての桁を正確に表すことができません。
そのため整数を整数のまま扱わせるためにビットシフト演算子や整数除算演算子を使用しました。

なお,ビットシフト演算子を使う際にはこちらも併せてビット演算にするべきです。
> If (data3 mod 2) = 0 Then
If (data3 And &h1) = 0 Then
> data2=data2+(2.0^c)*Val(temp2$)
data2 = data2 + (1 << c) * Val(temp2$)
faro

#3 投稿記事 by faro »

イグトランスさま

コメントありがとうございます。
聞いたことはある程度なので,さらにビットシフトについて勉強が必要のようです・・・。
やはり,プログラマーがここら辺のこと(浮動小数点数型では全ての桁を正確に表すことがでない)に気をつけなくてはいけないことを認識しました。(一応問題は解決しました)

ついでの報告になりますが,前投稿で指摘したqwordとinputの関係ですが,
ファイル入力形式でも同じ症状が確認できました。
やはりバグなのでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

はい,Input/PrintはQWord/Int64が導入された当初からそんな感じです。
当分は自分で文字列へ変換してやる必要がありそうです。
Sinryow
記事: 141
登録日時: 2005年5月31日(火) 09:34
お住まい: 北海道
連絡する:

#5 投稿記事 by Sinryow »

それこそ,Str$やVal関数がDouble型の数値を扱う前提で作られているからうまくいかないのではないでしょうか?(Inputでは内部でValを,Printでは内部でStr$を使っているはず。)

Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
Val関数については・・・「Val_Int64」とか別個の関数を作るしかなさそうですね・・・。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

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

> Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
それがAB4.20では残念ながらエラーになってしまいます。
http://www.discoversoft.net/forum/viewt ... t=679#2978
おそらく将来的には改善されるものと思っていますが。
返信する