ホーム ] 公称精度/定数 ] 関係演算 ] 加減算 ] 乗除算 ] 数学関数-1 ] 数学関数-2 ] 数学関数-3 ] 数学関数-4 ] 予測関数 ]

上へ
階乗/冪乗予測関数
ニュートン予測関数
級数予測関数
演算時間予測関数

MegaPrecisionクラス

演算時間予測関数

最終更新日:2007/04/26 新規

●概要 

 MegaPrecitionがインストールされた実機でのMegaPrecision の基本演算時間を予測する。附属のシステムツールにて、予め実機の基本演算時間が測定されている必要がある。

●条件

 この関数が動作するには、予め、ユーティリティにより、"システム設定"メニューにてテーブルを生成しておく必要がある。 対応するテーブルがないと、値0 が返る。

●関数仕様

○列挙体/構造体

 評価する演算のパラメータを指定するための列挙体/構造体である。

Public Enum Operation
   Comp = 1
   AddSubt
   Mul  
   MulI
   MulS             '自動選択乗算で、MulSLimt に従う
   MulSd           '特殊 常にMulSの時間となる
   FMul 
   Div
   DivI  
   RDiv
End Enum

Public Structure OperationParam
   Public Operation As Operation      '演算種
   Public SubPrecision As Integer      '副精度(実桁数):Div/Mul/MulS/MulSd の場合にのみ有効
   Public N As Integer                     '演算回数

   Sub New(OP As Operation, SP As Integer, N As Integer)
      Me.Operation = OP
      Me.SubPrecision = SP
      Me.N = N
   End Sub

   Sub New(OP As Operation, SP As Integer)
      Me.Operation = OP
      Me.SubPrecision = SP
      Me.N = 1
   End Sub
End Structure  

○時間関数チェック

IsReadyEstimateTime() As Boolean

 演算時間評価のためのテーブルが全て準備されていれば、True が返る。
  

○個別時間関数

GetOperationTime(MainPrecision As Integer, Operation As Operation, SubPrecision As Integer) As Double

 Operation に演算種、Precision に主精度(演算する実際の桁数)、もし、MulS/MulSd の場合は、SubPrecision に、16〜1024 の桁数を8 の倍数で指定する。Div の場合でも、SubPrecision = 8 であれば、DivI と評価される。Mul の場合でも、SubPrewcision = 8 であれば、MulI、MulsLimit 以内であればMulS と評価される。自動選択乗除算が完全にシミュレートされる。単独演算の単位演算時間が ns で返る。

○組合せ時間関数

EstimateCalculationTime(MainPrecision As Integer, Param() As OperationParam) As Double

 Param配列に、必要な演算のパラメータを与えると、それら全ての合計演算時間が返る。単位は、ns。

<用例>

・例1

公称精度が 8032桁で、

 C = Add(W, Mul(Mul(X, X), Add(Y, Z))) では、

Calc() As OperationParam = {New OperationParam(Operation.Mul, 0, 2)
                                       , New OperationParam(Operation.AddSubt, 0, 2)}

EstimateCalculationTme(8032, Calc) 

とする。

・例2

公称精度が 120032桁で、

Do
   S = Div(Mul(S, A), N)
   SM = Add(SM, S)
   If S.IsZero OrElse S.Exponent < -PP Then Exit Do
   N = N + 1
Loop

 (N が1億未満、Sが32桁の短い多倍長の場合)

Calc() As OperationParam = {New OperationParam(Operation.MulS, 32, 1)
                                       , New OperationParam(Operation.AddSubt, 0, 1)
                                       , New OperationParam(Operation.DivI, 0, 1)}}

EstimateCalculationTme(120032, Calc)

が、1ループ当りの演算時間となる。

通常、LoopIf S.IsZero OrElse S.Exponent < -PP や、N = N + 1 は、無視して も時間評価には問題ない。

○演算時間表示

ShowCalculationTime(ByVal Time As Double) As String

 秒で表された時間を文字列にする。nS、μS、mS、S などが自動的に変換される。有効桁数は5桁程度となる。(それ以上は無意味なので)

<用例>

 ShowCalculateTime(123.4)  → 2 M 3.4 S