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

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: Qwordについて(10進数,2進数の変換)

by イグトランス » 2006年2月10日(金) 07:43

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

by Sinryow » 2006年2月09日(木) 23:56

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

Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
Val関数については・・・「Val_Int64」とか別個の関数を作るしかなさそうですね・・・。

by イグトランス » 2006年2月09日(木) 17:05

はい,Input/PrintはQWord/Int64が導入された当初からそんな感じです。
当分は自分で文字列へ変換してやる必要がありそうです。

by faro » 2006年2月09日(木) 00:40

イグトランスさま

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

ついでの報告になりますが,前投稿で指摘したqwordとinputの関係ですが,
ファイル入力形式でも同じ症状が確認できました。
やはりバグなのでしょうか?

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

by イグトランス » 2006年2月08日(水) 21:34

> 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$)

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

by faro » 2006年2月08日(水) 09:33

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

ページトップ