ab.com コミュニティ

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

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




新しいトピックを投稿する  トピックへ返信する  [ 7 件の記事 ] 

この関数は役に立ったか
全然。まったく。
ちょっとだけ。すこし。
まぁまぁ。普通。
けっこう。かなり。
とても。ものすごく。
1 個までオプションを選択できます

投票結果を見る
作成者 メッセージ
投稿記事Posted: 2006年4月05日(水) 06:29 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
関数のソースコード


各関数の説明


QWord型とInt64型用に、Print,Input,Str$,Valの4関数を作ってみました。
バグや明らかな書き間違い、質問や意見など何かあったらどうぞ。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月24日(土) 20:57 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
QWord型とInt64型用の、掛け算と割り算と余り算(Mod)を作りました。

関数のソースコード 各関数の説明
64ビット型の乗除算は、内部でDouble型に直してから行うらしく大きい数を行うとずれが生じます。
これらの関数ではシフト演算と加算減算のみの作業でこれらを行っているため、ずれは生じません。(ただし、普通に乗除算を行うより少し遅くなります。)

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月25日(日) 02:46 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
64bit 版乗除算について
このアルゴリズムでは、乗算は 63 回、除算では条件を満たすまで無限ループ(!)を行っていますが、実際は乗算ならば 4 回の乗算と 3 回の加算、また除算ならば2 回の除算と 1 回の加算、その他細々としたビット演算で計算可能です。
と言うわけで作ってみたのですが、AB が期待したとおりに動作しなかったり、地雷を踏みまくったりでそれらを回避するために酷いコードになったので、ここに挙げるのは遠慮させてもらいます(ぉ
バグ報告レポートを作成していたのですが、結構な数になったのでくじけちまったorz


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

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
既に書いた分だけでもバグ報告へ出したほうがよいと思います。

ところで整数除算演算子 \ を使ったときだけは64ビット整数でも浮動小数点演算を使っていないようです。
効率はあまり良くなさそうですが。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月25日(日) 12:21 
オフライン

登録日時: 2005年5月31日(火) 07:49
記事: 162
自分はいったい何をしているのだろう?という疑問に駆られたので、コーディング作業を中断して覗いてみましたよ、EXE の中を。
そしたら地雷原や不審な挙動の原因が少しだけ判りました。それは後ほどバグ板に提出する方向で。
ここでは調査結果の一部を報告します。

> 64ビット型の乗除算は、内部でDouble型に直してから行うらしく
こちらでは確認できませんでした。といっても QWord * QWord の組み合わせしか検証していませんが(汗
この現象が発生する条件を記してもらえればたすかります(バグ板で)。
なお QWord の乗算では、洗練された専用乗算ルーチンを使用して計算していました。

> ところで整数除算演算子 \ を使ったときだけは64ビット整数でも浮動小数点演算を使っていないようです。
> 効率はあまり良くなさそうですが。
こちらは確認できました。こちらも専用の関数を呼び出していますね。
効率は良くなさそうとのことですが、乗算関数同様に最適化されているように見えます。おそらく C++ が吐いたコードでしょうね。


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2006年6月25日(日) 19:08 
オフライン

登録日時: 2005年7月25日(月) 13:27
記事: 893
お住まい: 埼玉県東松山市
>>tak
> 除算では条件を満たすまで無限ループ(!)を行っていますが
最高でも63回程度のはずです。(毎回iの数値を減算していって、i=0の時に抜け出すため。)

> こちらでは確認できませんでした。といっても QWord * QWord の組み合わせしか検証していませんが(汗
調べたところ、乗算の場合はQWord型のまま行うみたいなのですが、除算の場合にDouble型を使用しているようです。

> 効率は良くなさそうとのことですが、乗算関数同様に最適化されているように見えます。
比較したいところでしたが、手元にあるOpcodes.hlp(機械語の速度の表みたいなやつ)に載っていない命令がいくつもあったので比較できません。
誰か次の物についてクロック数が分かる人は教えてください。
FILD,FDIVRP,FSTP,FLD,FNSTCW,OpdSz,FLDCW,FISTP,FLDCW
実数除算のほうにクロック数が分からない未知の命令語がこれだけあります。
お手上げですね^^;
分かる部分だけで38クロックです。

整数除算の方は分かるやつばっかりなのですぐに算出できました。
途中で後分岐のループが一個入ってますが、それをスルーしたとして166クロック~228クロック、ループを一回繰り返すごとに+16クロックです。
ちなみにこのループを使わない場合もあって、そちらは158クロックでした。

ところで、QWord型に対してインクリメントを行った時に変数の値が壊れたような気がしました。誰か試してみてください。

_________________
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。


通報する
ページトップ
 記事の件名: バグ報告
投稿記事Posted: 2007年3月05日(月) 03:55 
Val関数にて、文字列中の「0」の部分が戻り値では「1」となるバグがあります。
隠し関数が原因のようなので、以下のように修正してみました。
コード:
Function Kakeru_QWord(A As Byte,B As QWord) As QWord
    Dim C As QWord
    Dim I As Long
    C = 0
    If A>0 then    'この行と
        For I=1 To A
            C = C + B
        Next I
    Else
        C = 0    'この行を修正
    End If
    Kakeru_QWord = C
End Function

Function Kakeru_Int64(A As Byte,B As Int64) As Int64
    Dim C As QWord
    Dim I As Long
    C = 0
    If A>0 then    '同じくこの行と
        For I=1 To A
            C = C + B
        Next I
    Else
        C = 0    'この行を修正
    End If
    Kakeru_Int64 = C
End Function


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

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


オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[9人]


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

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