FreeBASIC マニュアルのトップに戻る

FreeBASIC GMP ライブラリを使ったユーザ定義型と活用例

目次→フォーラム→FreeBASIC→補足new header file GMP←オリジナル・フォーラム

GMP を使ったユーザ定義型と活用例 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る

 このページは、srvaldez さんに new header file GMP で教えてもらった、任意精度算術ライブラリ GMP の活用方法とサンプル・プログラムです。

コンストラクタとデストラクタを含む構造体として、GMP のユーザ定義型を作ります。
そして、.bi ファイルに、演算子の多重定義を含めておきます。
こうすると、Dim 文の修正だけで、GMP ライブラリが使えるようになるのです!
普通の FreeBasic のプログラムの Dim 文で、変数に設定する型を Integer などから gmpf にするだけで、プログラムを変更することなく、使える数値の桁数を増やすことができます。

「活用例」については、GMP ライブラリを使ったユーザ定義型の活用例 も参照下さい。

参考:多倍長演算ライブラリ(GNU MP) Version 6.1.2マニュアル
https://na-inet.jp/na/gmp_ja/

環境準備:
ダウンロード GMP.7z でヘッダー・ファイルをダウンロードして、該当フォルダに保存します。
↑ FreeBASIC V 1.05.0 に最新ヘッダー・ファイルが含まれているので不要
gmp-6.1.2(gmp-6.1.2.zip) ファイルをダウンロードして、共有ライブラリ libgmp.a を該当フォルダに保存します。
私の場合は、C:\Tool\FreeBASIC\lib\win32\libgmp.a

先に下のユーザ定義型 gmpf-overloadJP.bi を、お好みのフォルダに保存します。

その上で、このサンプル・プログラムを、同じフォルダに保存します。
そして、このサンプル・プログラムをコンパイルして実行します。

サンプルプログラム1:乗算、平方根、円周率

このサンプル・プログラムを、例えば SmallExampleJP.bas という名前で、gmpf-overloadJP.bi と同じフォルダに保存します。
そして、この SmallExampleJP.bas をコンパイルして実行します。
#Include "gmpf-overloadJP.bi"

'by srvaldez ≫ Dec 16, 2016 4:06 
'https://www.freebasic.net/forum/viewtopic.php?f=3&t=23225&start=15

'円周率
Function pi( ByVal prec As Long) As gmpf
   set_precision(prec)

   Dim As gmpf a,b,t,p,aa,bb,tt,pp 'ユーザ定義型で、各変数を設定します

   a=1
   b=0.5
   t=0.25
   p=1
   b=gmpf_sqr( b )

   For i As Integer = 1 To Int(Log(prec)*1.44269504088896)
      aa = (a+b)/2
      bb = gmpf_sqr(a*b)
      tt = t-p*(a-aa)^2
      pp = 2*p
      Swap a, aa
      Swap b, bb
      Swap t, tt
      Swap p, pp
   Next

   Return (a+b)^2/4/t
End Function

set_precision(20) '精度を少なくとも20桁に設定

Dim As Integer i
Dim As gmpf y,x="0.333333333333333333333333333" '文字列を使って浮動小数を代入

Print "乗算"
If 3*x<1 Then
   Print "3*x は 1 未満"
End If
Print

' for loop で mpf を使う
Print "平方根"
For x=1 To 10
   y=gmpf_sqr(x)
   Print "gmpf_sqr";x;" = ";y
Next
Print

Print "mpf 数を表示する別の方法"
Print "平方根(ルート10)"
Print y.toString("%15.10f") 'mpf 数を表示する別の方法  <全体の幅 15>.<小数点以下の幅 10> 実数を出力
Print

Print "円周率"
Print pi(1000)
Print "何かキー入力で終了";
Sleep

参考:printf の書式指定(詳細)
http://seiai.ed.jp/sys/text/csb/chs05/c05b050.html

サンプルプログラム2:素因数分解

このサンプル・プログラムを、例えば prime_factors2FB7GMPsrvaldez.bas という名前で、gmpf-overloadJP.bi と同じフォルダに保存します。
そして、この prime_factors2FB7GMPsrvaldez.bas をコンパイルして実行します。
#Include "gmpf-overloadJP.bi"
# include "vbcompat.bi"

' 素因数分解
 
Declare Sub STRreplace(ByRef Expression As String, ByRef Find As String, ByRef Replacement As String, ByVal Start As Integer = 1)
 
 
Dim Suuchi As String 
Dim N As gmpf
Dim STARTT As Long
Dim ENDTIME As Long
Dim Minut As Integer
Dim A As gmpf
Dim HANTEI As String
Dim Hairetsu() As gmpf
Dim I As Integer
Dim J As Integer
Dim Kekka As gmpf
Dim Counter As LongInt

 
set_precision(25) '精度を少なくとも25桁に設定する
 
 KURIKAESHI:
 
 Cls
 PRINT "素因数分解します。"
 PRINT "任意の整数を入力して下さい。"
 PRINT "例えば、12,319 とか 4,294,967,297 とか入力してEnterします。"
 PRINT "あるいは、99,400,891 とか 6,041,375,340 とか、123,456,789,013 とか、"
 Print "2,305,843,008,139,952,128 とか、"
 PRINT "70,000,104,900,007 とか、70,000,005,000,000,007 など入力してEnterします。"
 Print "以下は ULongInt を超えていますが・・・"
 PRINT " 18,446,744,073,709,551,617 = 274,177 * 67,280,421,310,721 "
 Print "121,439,531,096,594,251,777 = 3,930,785,153 * 30,894,471,809  (2時間かかる)"
 Print

 I=0
 Kekka=1
 Counter=0
 
  Line Input Suuchi
 
 STRreplace(Suuchi, ",", "")
 N = Suuchi

 STARTT=VAL(LEFT(Time,2))*3600+VAL(MID(Time,4,2))*60+VAL(RIGHT(Time,2))
 
 Cls
 PRINT Suuchi ;"=";
 
Gusu:
   A=2

Tsugi:
   Counter= Counter+1

   IF A>SQR(N) THEN GOTO Owari
   IF N-INT(N/A)*A=0 THEN GOTO Tsuzuku
   IF A>2 THEN A=A+2 :GOTO Tsugi
   A=A+1 :GOTO Tsugi

Tsuzuku:
 PRINT A; "*" ;
 I=I+1
 ReDim Preserve Hairetsu(I)
 Hairetsu(I)=A
 N=N/A : GOTO Gusu

Owari:
 PRINT N
 
 ENDTIME = VAL(LEFT(Time,2))*3600+VAL(MID(Time,4,2))*60+VAL(RIGHT(Time,2))
 Minut=(ENDTIME-STARTT)\60
 PRINT USING "処理時間は、###分 ##秒でした。"; Minut; (ENDTIME-STARTT)-Minut*60
 Print
 Print  "演算の繰返し回数:"; Format(Counter,"#,##0")
 Print

 Print "検算します。"
 For J=1 To I
 	Print Hairetsu(J);"*";
 	Kekka=Kekka*Hairetsu(J)
 Next
 Print N;"="
 Print Kekka*N
 Print
 Print "もう一度やりますか? Y (または y)なら再度。"
 Input "それ以外の文字を入力すると終了します。",HANTEI
 If HANTEI="Y" Or HANTEI="y" Then
	 GoTo KURIKAESHI
 EndIf

Sub STRreplace(ByRef Expression As String, ByRef Find As String, ByRef Replacement As String, ByVal Start As Integer = 1)
   Var p = InStr(Start, Expression, Find), li = Len(Find), ls = Len(Replacement) : If li = ls Then li = 0
   While p
      If li Then Expression = Left(Expression, p - 1) & Replacement & Mid(Expression, p + li) Else Mid(Expression, p) = Replacement
      p = InStr(p + ls, Expression, Find)
   Wend
End Sub

このページの先頭に戻る↑ トップページに戻る

ユーザ定義型と演算子多重定義

gmpf-overloadJP.bi の名前で保存します。
'by srvaldez ≫ Dec 16, 2016 4:06 
'https://www.freebasic.net/forum/viewtopic.php?f=3&t=23225&start=15

#Include Once "gmp.bi"

Type gmpf
    Declare Constructor ( )
    Declare Constructor ( ByVal rhs As Long )
    Declare Constructor ( ByVal rhs As LongInt )
    Declare Constructor ( ByVal rhs As Integer )
    Declare Constructor ( ByVal rhs As Double )
    Declare Constructor ( ByVal rhs As Single )
    Declare Constructor ( ByRef rhs As String )
    Declare Constructor ( ByRef rhs As gmpf )
    Declare Constructor ( ByRef rhs As __mpq_struct )
    Declare Constructor ( ByRef rhs As __mpz_struct )
    Declare Destructor ( )
    Declare Operator Let ( ByRef rhs As gmpf )
    Declare Operator Let ( ByRef rhs As __mpq_struct )
    Declare Operator Let ( ByRef rhs As __mpz_struct )
    Declare Operator Let ( ByVal rhs As Long )
    Declare Operator Let ( ByVal rhs As LongInt )
    Declare Operator Let ( ByVal rhs As Integer )
    Declare Operator Let ( ByVal rhs As Double )
    Declare Operator Let ( ByVal rhs As Single )
    Declare Operator Let ( ByRef rhs As String )
    Declare Operator Cast ( ) As String
    Declare Operator Cast ( ) As Long
    Declare Operator Cast ( ) As Double
    Declare Operator Cast ( ) As Single
    
    '----------------------------------------------
    Declare Operator += (ByRef rhs As gmpf)
    Declare Operator += (ByVal rhs As Long)
    Declare Operator += (ByVal rhs As Double)
    Declare Operator += (ByVal rhs As Single)
    Declare Operator += (ByVal rhs As LongInt)
    Declare Operator += (ByVal rhs As Integer)
    Declare Operator += (ByRef rhs As String)
    Declare Operator -= (ByRef rhs As gmpf)
    Declare Operator -= (ByVal rhs As Double)
    Declare Operator -= (ByVal rhs As Single)
    Declare Operator -= (ByVal rhs As LongInt)
    Declare Operator -= (ByVal rhs As Integer)
    Declare Operator -= (ByVal rhs As Long)
    Declare Operator -= (ByRef rhs As String)
    Declare Operator *= (ByRef rhs As gmpf)
    Declare Operator *= (ByVal rhs As Double)
    Declare Operator *= (ByVal rhs As Single)
    Declare Operator *= (ByVal rhs As LongInt)
    Declare Operator *= (ByVal rhs As Integer)
    Declare Operator *= (ByVal rhs As Long)
    Declare Operator *= (ByRef rhs As String)
    Declare Operator /= (ByRef rhs As gmpf)
    Declare Operator /= (ByVal rhs As Double)
    Declare Operator /= (ByVal rhs As Single)
    Declare Operator /= (ByVal rhs As LongInt)
    Declare Operator /= (ByVal rhs As Integer)
    Declare Operator /= (ByVal rhs As Long)
    Declare Operator /= (ByRef rhs As String)
    Declare Operator ^= (ByVal rhs As ULong)
    Declare Operator ^= (ByRef rhs As gmpf)
   
    ' For Next Implicit step = +1
    Declare Operator For ( )
    Declare Operator Step( )
    Declare Operator Next( ByRef end_cond As gmpf ) As Integer
    ' For Next Exlicit step
    Declare Operator For ( ByRef stp As gmpf )
    Declare Operator Step( ByRef stp As gmpf )
    Declare Operator Next( ByRef end_cond As gmpf, ByRef step_var As gmpf ) As Integer
    '----------------------------------------------
    Declare Function toString( ByVal frmt As String ="") As String
    Declare Function toLong ( ) As Long
    Declare Function toDouble ( ) As Double
    Declare Function toSingle ( ) As Single
    Declare Sub Set_Prec (ByVal n As Long = -1)
    
    num As __mpf_struct
End Type

Sub set_precision(ByVal n As ULong=mpf_get_default_prec()*.3)
    mpf_set_default_prec( n*3.33 )
End Sub

Function gmpf.toString( ByVal frmt As String ="") As String
   Dim As Long length = mpf_get_prec(@num)*0.3
   Dim As String sp =" "
   If frmt="" Or frmt="g" Then
      frmt="%"+Str(length+4)+"."+Str(length-1)+"g"
   ElseIf frmt="f" Then
      frmt="%"+Str(length+4)+"."+Str(length-1)+"f"
   ElseIf frmt="e" Then
      frmt="%"+Str(length+4)+"."+Str(length-1)+"e"
   End If
   frmt = Left(frmt,Len(frmt)-1)+"F"+Right(frmt,1)
   If InStr(frmt , "%")=0 Then frmt = "%"+frmt
   length = gmp_snprintf(0, 0, frmt, @num)
   Dim As ZString Ptr rstring=Allocate(length+20)
   gmp_sprintf(rstring, frmt, @num)
   If mpf_sgn(@num)<0 Then sp = ""
   Function = sp + LTrim(*rstring)
   DeAllocate(rstring)
End Function

Sub gmpf.Set_Prec(ByVal n As Long = -1)
   If n=-1 Then
      mpf_set_prec(@num, mpf_get_default_prec())
   Else
      mpf_set_prec(@num, n*3.33)
   End If
End Sub

Function gmpf.toLong ( ) As Long
   Function = mpf_get_si(@num)
End Function

Function gmpf.toDouble ( ) As Double
   Function = mpf_get_d(@num)
End Function

Function gmpf.toSingle ( ) As Single
   Dim As Double sx
   sx = mpf_get_d(@num)
   Function = sx
End Function

Constructor gmpf ( )
   mpf_init(@num)
   mpf_set_si(@num, 0)
End Constructor

Constructor gmpf ( ByVal rhs As Long )
   mpf_init(@num)
   mpf_set_si(@num, rhs)
End Constructor

Constructor gmpf ( ByRef rhs As __mpq_struct )
   mpf_init(@num)
   mpf_set_q(@num, @rhs)
End Constructor

Constructor gmpf ( ByRef rhs As __mpz_struct )
   mpf_init(@num)
   mpf_set_z(@num, @rhs)
End Constructor

Constructor gmpf ( ByRef rhs As String )
   mpf_init(@num)
   mpf_set_str(@num, rhs, 10)
End Constructor

Constructor gmpf ( ByRef rhs As gmpf )
   mpf_init(@num)
   mpf_set(@num, @rhs.num)
End Constructor

Constructor gmpf ( ByVal rhs As LongInt )
   Dim As String s=Str(rhs)
   mpf_init(@num)
   mpf_set_str(@num, s, 10)
End Constructor

Constructor gmpf ( ByVal rhs As Integer )
   Dim As String s=Str(rhs)
   mpf_init(@num)
   mpf_set_str(@num, s, 10)
End Constructor

Constructor gmpf ( ByVal rhs As Double )
   mpf_init(@num)
   mpf_set_d(@num, rhs)
End Constructor

Constructor gmpf ( ByVal rhs As Single )
   Dim As Double sx = rhs
   mpf_init(@num)
   mpf_set_d(@num, sx)
End Constructor

Destructor gmpf ( )
   mpf_clear(@num)
End Destructor

Operator gmpf.let ( ByRef rhs As gmpf )
   mpf_set(@num, @rhs.num)
End Operator

Operator gmpf.let ( ByRef rhs As __mpq_struct )
   mpf_set_q(@num, @rhs)
End Operator

Operator gmpf.let ( ByRef rhs As __mpz_struct )
   mpf_set_z(@num, @rhs)
End Operator

Operator gmpf.let ( ByVal rhs As Long )
   mpf_set_si(@num, rhs)
End Operator

Operator gmpf.let ( ByRef rhs As String )
   mpf_set_str(@num, rhs, 10)
End Operator

Operator gmpf.Let ( ByVal rhs As LongInt )
   Dim As String s=Str(rhs)
   mpf_set_str(@num, s, 10)
End Operator

Operator gmpf.Let ( ByVal rhs As Integer )
   Dim As String s=Str(rhs)
   mpf_set_str(@num, s, 10)
End Operator

Operator gmpf.Let ( ByVal rhs As Double )
   mpf_set_d(@num, rhs)
End Operator

Operator gmpf.Let ( ByVal rhs As Single )
   Dim As Double sx = rhs
   mpf_set_d(@num, sx)
End Operator

Operator gmpf.cast ( ) As String
   Dim As Long length = mpf_get_prec(@num)*0.3
   Dim As String sp =" ", s = "%"+Str(length+4)+"."+Str(length-1)+"Fg"
   length = gmp_snprintf(0, 0, s, @num)
   Dim As ZString Ptr rstring=Allocate(length+20)
   gmp_sprintf(rstring, s, @num)
   If mpf_sgn(@num)<0 Then sp = ""
   Operator = sp + LTrim(*rstring)
   DeAllocate(rstring)
End Operator

Operator gmpf.cast ( ) As Long
   Operator = mpf_get_si(@num)
End Operator

Operator gmpf.cast ( ) As Double
   Operator = mpf_get_d(@num)
End Operator

Operator gmpf.cast ( ) As Single
   Operator = mpf_get_d(@num)
End Operator

'============================================================================
'' For Next for gmpf type
''
'' 暗黙的ステップ版
'' 
'' この例では、暗黙的ステップを1と解釈します
''
Operator gmpf.for ( )
End Operator
 
Operator gmpf.step ( )
        This += 1 'this = this+1 '
End Operator 
 
Operator gmpf.next ( ByRef end_cond As gmpf ) As Integer
        Return This <= end_cond
End Operator
 
 
'' 明示的ステップ版
'' 
Operator gmpf.for ( ByRef step_var As gmpf )
End Operator
 
Operator gmpf.step ( ByRef step_var As gmpf )
        This += step_var 'this = this + step_var '    
End Operator 
 
Operator gmpf.next ( ByRef end_cond As gmpf, ByRef step_var As gmpf ) As Integer
        If step_var < 0 Then
                Return This >= end_cond
        Else
                Return This <= end_cond
        End If
End Operator

'============================================================================

Operator + ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_add(@result.num, @lhs.num, @rhs.num)
   Operator = result
End Operator

Operator + ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf
   Dim As gmpf result
   mpf_add_ui(@result.num, @lhs.num, rhs)
   Operator = result
End Operator

Operator - ( ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_neg(@result.num, @rhs.num)
   Operator = result
End Operator

Operator - ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_sub(@result.num, @lhs.num, @rhs.num)
   Operator = result
End Operator

Operator - ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf
   Dim As gmpf result
   mpf_sub_ui(@result.num, @lhs.num, rhs)
   Operator = result
End Operator

Operator - ( ByVal lhs As culong, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_ui_sub(@result.num, lhs, @rhs.num)
   Operator = result
End Operator

Operator * ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_mul(@result.num, @lhs.num, @rhs.num)
   Operator = result
End Operator

Operator * ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf
   Dim As gmpf result
   mpf_mul_ui(@result.num, @lhs.num, rhs)
   Operator = result
End Operator

Operator / ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_div(@result.num, @lhs.num, @rhs.num)
   Operator = result
End Operator

Operator / ( ByRef lhs As gmpf, ByVal rhs As culong ) As gmpf
   Dim As gmpf result
   mpf_div_ui(@result.num, @lhs.num, rhs)
   Operator = result
End Operator

Operator / ( ByVal lhs As culong, ByRef rhs As gmpf ) As gmpf
   Dim As gmpf result
   mpf_ui_div(@result.num, lhs, @rhs.num)
   Operator = result
End Operator

Operator ^ ( ByRef lhs As gmpf, ByVal rhs As ULong ) As gmpf
   Dim As gmpf result
   mpf_pow_ui(@result.num, @lhs.num, rhs)
   Operator = result
End Operator

Operator gmpf.+= (ByRef rhs As gmpf)
   mpf_add(@this.num, @this.num, @rhs.num)
End Operator

Operator gmpf.+= (ByVal rhs As Long)
   Dim As gmpf x
   mpf_set_si(@x.num, rhs)
   mpf_add(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.+= (ByVal rhs As Double)
   Dim As gmpf x
   mpf_set_d(@x.num, rhs)
   mpf_add(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.+= (ByVal rhs As Single)
   Dim As gmpf x
   Dim As Double dx = rhs
   mpf_set_d(@x.num, dx)
   mpf_add(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.+= (ByVal rhs As LongInt)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_add(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.+= (ByVal rhs As Integer)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_add(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.+= (ByRef rhs As String)
   Dim As gmpf tmp
   tmp=rhs
   mpf_add(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.-= (ByRef rhs As gmpf)
   mpf_sub(@this.num, @this.num, @rhs.num)
End Operator

Operator gmpf.-= (ByVal rhs As Long)
   Dim As gmpf x
   mpf_set_si(@x.num, rhs)
   mpf_sub(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.-= (ByVal rhs As Double)
   Dim As gmpf x
   mpf_set_d(@x.num, rhs)
   mpf_sub(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.-= (ByVal rhs As Single)
   Dim As gmpf x
   Dim As Double dx = rhs
   mpf_set_d(@x.num, dx)
   mpf_sub(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.-= (ByVal rhs As LongInt)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_sub(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.-= (ByVal rhs As Integer)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_sub(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.-= (ByRef rhs As String)
   Dim As gmpf tmp
   tmp=rhs
   mpf_sub(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.*= (ByRef rhs As gmpf)
   mpf_mul(@this.num, @this.num, @rhs.num)
End Operator

Operator gmpf.*= (ByVal rhs As Long)
   Dim As gmpf x
   mpf_set_si(@x.num, rhs)
   mpf_mul(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.*= (ByVal rhs As Double)
   Dim As gmpf x
   mpf_set_d(@x.num, rhs)
   mpf_mul(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.*= (ByVal rhs As Single)
   Dim As gmpf x
   Dim As Double dx = rhs
   mpf_set_d(@x.num, dx)
   mpf_mul(@this.num, @this.num, @x.num)
End Operator

Operator gmpf.*= (ByVal rhs As LongInt)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_mul(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.*= (ByVal rhs As Integer)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_mul(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.*= (ByRef rhs As String)
   Dim As gmpf tmp
   tmp=rhs
   mpf_mul(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf./= (ByRef rhs As gmpf)
   mpf_div(@this.num, @this.num, @rhs.num)
End Operator

Operator gmpf./= (ByVal rhs As Long)
   Dim As gmpf x
   mpf_set_si(@x.num, rhs)
   mpf_div(@this.num, @this.num, @x.num)
End Operator

Operator gmpf./= (ByVal rhs As Double)
   Dim As gmpf x
   mpf_set_d(@x.num, rhs)
   mpf_div(@this.num, @this.num, @x.num)
End Operator

Operator gmpf./= (ByVal rhs As Single)
   Dim As gmpf x
   Dim As Double dx = rhs
   mpf_set_d(@x.num, dx)
   mpf_div(@this.num, @this.num, @x.num)
End Operator

Operator gmpf./= (ByVal rhs As LongInt)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_div(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf./= (ByVal rhs As Integer)
   Dim As gmpf tmp
   tmp=Str(rhs)
   mpf_div(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf./= (ByRef rhs As String)
   Dim As gmpf tmp
   tmp=rhs
   mpf_div(@this.num, @this.num, @tmp.num)
End Operator

Operator gmpf.^= (ByVal rhs As ULong)
   mpf_pow_ui(@this.num, @this.num, rhs)
End Operator

Operator = ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) = 0)
End Operator

Operator < ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) < 0)
End Operator

Operator > ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) > 0)
End Operator

Operator <= ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) <= 0)
End Operator

Operator >= ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) >= 0)
End Operator

Operator <> ( ByRef lhs As gmpf, ByRef rhs As gmpf ) As Integer
   Operator = (mpf_cmp(@lhs.num, @rhs.num) <> 0)
End Operator

Function gmpf_Abs(ByRef rhs As gmpf) As gmpf
   Dim As gmpf result
   mpf_abs(@result.num, @rhs.num)
   Function = result
End Function

Function gmpf_ceil(ByRef x As gmpf) As gmpf
   Dim As gmpf result
   mpf_ceil(@result.num, @x.num)
   Function = result
End Function

Function gmpf_floor(ByRef x As gmpf) As gmpf
   Dim As gmpf result
   mpf_floor(@result.num, @x.num)
   Return result
End Function

Function gmpf_int(ByRef x As gmpf) As gmpf
   Dim As gmpf result
   mpf_trunc(@result.num, @x.num)
   Function = result
End Function

Function gmpf_sgn(ByRef x As gmpf) As Integer
   Function = mpf_sgn(@x.num)
End Function

'平方根
Declare Function gmpf_Sqr OverLoad ( ByRef number As gmpf ) As gmpf

Function gmpf_Sqr(ByRef x As gmpf) As gmpf
   Dim As gmpf result
   mpf_sqrt(@result.num, @x.num)
   Return result
End Function

Function gmpf_Sqr(ByVal x As ULong) As gmpf
   Dim As gmpf result
   mpf_sqrt_ui(@result.num, x)
   Return result
End Function
 
補足 に戻る
←リンク元に戻る プログラム開発関連に戻る
ページ歴史:2016-12-18
日本語翻訳:WATANABE Makoto、原文著作者:srvaldez, 2016-12-16 4:06

ホームページのトップに戻る

表示-非営利-継承