ab.com コミュニティ
https://www.activebasic.com/forum/

QWord型とInt64型を操作する関数
https://www.activebasic.com/forum/viewtopic.php?t=916
ページ 11

作成者:  konisi [ 2006年4月05日(水) 06:29 ]
記事の件名:  QWord型とInt64型を操作する関数

関数のソースコード


各関数の説明


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

作成者:  konisi [ 2006年6月24日(土) 20:57 ]
記事の件名: 

QWord型とInt64型用の、掛け算と割り算と余り算(Mod)を作りました。

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

作成者:  tak [ 2006年6月25日(日) 02:46 ]
記事の件名: 

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

作成者:  イグトランス [ 2006年6月25日(日) 09:25 ]
記事の件名: 

既に書いた分だけでもバグ報告へ出したほうがよいと思います。

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

作成者:  tak [ 2006年6月25日(日) 12:21 ]
記事の件名: 

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

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

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

作成者:  konisi [ 2006年6月25日(日) 19:08 ]
記事の件名: 

>>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型に対してインクリメントを行った時に変数の値が壊れたような気がしました。誰か試してみてください。

作成者:  S_K_ [ 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

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/