ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年3月29日(金) 09:43

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 6 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 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


通報する
ページトップ
   
投稿記事Posted: 2006年2月08日(水) 21:34 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> 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$)


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年2月09日(木) 00:40 
イグトランスさま

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

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2006年2月09日(木) 17:05 
オフライン

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


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年2月09日(木) 23:56 
オフライン

登録日時: 2005年5月31日(火) 09:34
記事: 141
お住まい: 北海道
それこそ,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/
' ============================================================


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年2月10日(金) 07:43 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
> Str$関数については,関数のオーバーロードでDouble・Int64・QWordの3つを定義すればよいでしょう。
それがAB4.20では残念ながらエラーになってしまいます。
http://www.discoversoft.net/forum/viewt ... t=679#2978
おそらく将来的には改善されるものと思っていますが。


通報する
ページトップ
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 6 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Ahrefs [Bot] & ゲスト[14人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
cron
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean