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
Qwordについて(10進数,2進数の変換)
-
- 記事: 899
- 登録日時: 2005年5月31日(火) 17:59
- お住まい: 東京都
Re: Qwordについて(10進数,2進数の変換)
> 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$)
これを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$)
-
- 記事: 899
- 登録日時: 2005年5月31日(火) 17:59
- お住まい: 東京都
-
- 記事: 141
- 登録日時: 2005年5月31日(火) 09:34
- お住まい: 北海道
それこそ,Str$やVal関数がDouble型の数値を扱う前提で作られているからうまくいかないのではないでしょうか?(Inputでは内部でValを,Printでは内部でStr$を使っているはず。)
Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
Val関数については・・・「Val_Int64」とか別個の関数を作るしかなさそうですね・・・。
Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
Val関数については・・・「Val_Int64」とか別個の関数を作るしかなさそうですね・・・。
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
' Sinryow Game Home Page - http://www.sinryow.net/
' Sinryow ActiveBasic Center - http://ab.sinryow.net/
' ============================================================
-
- 記事: 899
- 登録日時: 2005年5月31日(火) 17:59
- お住まい: 東京都
> Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
それがAB4.20では残念ながらエラーになってしまいます。
http://www.discoversoft.net/forum/viewt ... t=679#2978
おそらく将来的には改善されるものと思っていますが。
それがAB4.20では残念ながらエラーになってしまいます。
http://www.discoversoft.net/forum/viewt ... t=679#2978
おそらく将来的には改善されるものと思っていますが。