Code: Select all
#include "gmp.bi"
dim as __mpz_struct p
dim as __mpz_struct o
dim as __mpz_struct r
dim as __mpz_struct e
mpz_init(@p)
mpz_init(@o)
mpz_init(@r)
mpz_init(@e)
Code: Select all
#include "gmp.bi"
dim as __mpz_struct p
dim as __mpz_struct o
dim as __mpz_struct r
dim as __mpz_struct e
mpz_init(@p)
mpz_init(@o)
mpz_init(@r)
mpz_init(@e)
Code: Select all
' 1 December 2016 - orinal by dodicat
' 11 December 2016 - frisian, added mpf_clear/mpz_clear statements
#Include Once "gmp.bi"
Type mpf_t As __mpf_struct
'approx list
'equals,greater,less,absolute
'sin,cos,tan,logtaylor,log,exp,power,atn,acos,asin,greater,equals,less
'absolute,Pi_ui
'_mod,_div
Dim Shared As ULongInt PRECISION
'========= Just in case you forget to set_precision ==========
precision=60
mpf_set_default_prec(PRECISION * 4)
'========================================================
Sub set_precision(n As UInteger)
PRECISION = n
mpf_set_default_prec(PRECISION * 4)
End Sub
Function equals Overload(a As mpf_t, b As mpf_t) As Integer
If Mpf_cmp(@a, @b) = 0 Then Return -1
Return 0
End Function
Function greater Overload(a As mpf_t, b As mpf_t) As Integer 'a>b
If mpf_cmp(@a, @b) > 0 Then Return -1
Return 0
End Function
Function less Overload(a As mpf_t, b As mpf_t) As Integer 'a<b
If mpf_cmp(@a, @b) < 0 Then Return -1
Return 0
End Function
Function Absolute Overload(a As mpf_t) As mpf_t
Dim As mpf_t Ab
mpf_init(@Ab)
mpf_abs(@Ab, @a)
Return Ab
End Function
Function Pi_ui Overload(places As UInteger) As mpf_t
' Dim As __mpf_struct a,b,t,p,aa,bb,tt,pp,pi
Dim As __mpf_struct a, b, t, aa, bb, tt, pi
mpf_init2(@a, 4*places)
mpf_init2(@b, 4*places)
mpf_init2(@t, 4*places)
' mpf_init2( @p, 4*places)
Dim As UInteger p
mpf_init2(@aa,4*places)
mpf_init2(@bb,4*places)
mpf_init2(@tt,4*places)
' mpf_init2( @pp,4*places)
mpf_init2(@pi,4*places)
mpf_set_ui(@a, 1)
mpf_set_ui(@b, 2) : mpf_sqrt(@b, @b)
mpf_set_str(@t,".25",10)
' mpf_set_str(@p,"1",10)
mpf_ui_div(@b,1,@b)
Do
mpf_add(@aa, @a, @b)
' mpf_div_ui(@aa, @aa, 2)
mpf_div_2exp(@aa, @aa, 1)
mpf_mul(@bb, @a, @b)
mpf_sqrt(@bb, @bb)
mpf_sub(@tt, @a, @aa)
mpf_mul(@tt,@tt,@tt)
' mpf_mul(@tt, @tt,@p)
mpf_mul_2exp(@tt, @tt, p)
p += 1
mpf_sub(@tt, @t, @tt)
' mpf_mul_ui(@pp, @p, 2)
mpf_swap(@a, @aa)
mpf_swap(@b, @bb)
mpf_swap(@t, @tt)
' mpf_swap(@p, @pp)
Loop Until Mpf_cmp(@a, @aa) = 0
mpf_add(@pi, @a, @b)
mpf_mul(@pi, @pi, @pi)
' mpf_div_ui(@pi, @pi, 4)
mpf_div_2exp(@pi, @pi, 2)
mpf_div(@pi, @pi, @t)
' remove big int's from memory
mpf_clear(@a) : mpf_clear(@aa)
mpf_clear(@b) : mpf_clear(@bb)
mpf_clear(@t) : mpf_clear(@tt)
Return pi
End Function
Function _sin Overload(x As mpf_t) As mpf_t
Dim As mpf_t XX, Term, Accum, _x, temp2, fac, pi2
mpf_init_set(@_x, @x)
mpf_init(@pi2)
mpf_init(@temp2)
If mpf_cmp_d(@x, 6.283185) >= 0 OrElse mpf_cmp_ui(@x, 0) < 0 Then
'======== CENTRALIZE ==============
'floor/ceil to centralize
pi2 = Pi_ui(precision)
mpf_mul_2exp(@pi2, @pi2, 1) ' pi2 = pi * 2
mpf_div(@temp2, @_x, @pi2) ' temp2 = _x / pi2
mpf_floor(@temp2, @temp2) ' temp2 = floor(temp2) 'rounds temp2 down towards minus infinity
mpf_mul(@temp2, @temp2, @pi2) ' temp2 = temp2 * p2
mpf_sub(@_x, @_x, @temp2) ' _x = _x - temp2 (_x = _x mod 2*pi)
End If
'==================================
' based on Richard methode for sin/cos in squares
Dim As Integer c = 1
mpf_init(@XX)
mpf_init(@Term)
mpf_init_set(@accum, @_x)
mpf_init_set_ui(@fac, 1)
mpf_mul(@XX, @_x, @_x)
mpf_neg(@XX, @XX) ' make XX negative
Do
c = c + 2
Mpf_swap(@temp2, @Accum)
mpf_mul_ui(@fac, @fac, c) ' avoid an overflow when c > 65536
mpf_mul_ui(@fac, @fac, (c -1)) ' split in two separate multiply's
mpf_mul(@_x , @_x, @XX) ' _x alternates between negative an positive
mpf_div(@Term, @_x, @fac)
mpf_add(@Accum, @temp2, @term) ' temp2 and accum are swapped, temp2 holds the previous content of accum
Loop Until Mpf_cmp(@Accum, @temp2) = 0
' clean up
mpf_clear(@XX) : mpf_clear(@Term) : mpf_clear(@fac)
mpf_clear(@_x) : mpf_clear(@temp2) : mpf_clear(@pi2)
Return accum
End Function
Function _cos Overload(x As mpf_t) As mpf_t
Dim As mpf_t XX, Term, Accum, _x, p, temp2, fac, pi2
mpf_init_set(@_x,@x)
mpf_init(@pi2)
mpf_init(@temp2)
If mpf_cmp_d(@x, 6.283185) >= 0 OrElse mpf_cmp_ui(@x, 0) < 0 Then
'======== CENTRALIZE ==============
'floor/ceil to centralize
pi2 = Pi_ui(precision)
mpf_mul_2exp(@pi2, @pi2, 1) ' pi2 = pi * 2
mpf_div(@temp2, @_x, @pi2) ' temp2 = _x / pi2
mpf_floor(@temp2, @temp2) ' temp2 = floor(temp2) 'rounds temp2 down towards minus infinity
mpf_mul(@temp2, @temp2, @pi2) ' temp2 = temp2 * p2
mpf_sub(@_x, @_x, @temp2) ' _x = _x - temp2 (_x = _x mod 2*pi)
End If
'==================================
' based on Richard methode for sin/cos in squares
Dim As Integer c
mpf_init(@XX)
mpf_init(@Term)
mpf_init_set_ui(@Accum, 1)
mpf_init_set_ui(@fac, 1)
mpf_init_set_ui(@p, 1)
mpf_mul(@XX, @_x, @_x)
mpf_neg(@XX, @XX)
Do
c += 2
Mpf_swap(@temp2, @accum)
mpf_mul_ui(@fac, @fac, c)
mpf_mul_ui(@fac, @fac, (c-1))
mpf_mul(@p, @p, @XX)
mpf_div(@term, @p, @fac)
mpf_add(@accum, @temp2, @term)
Loop Until Mpf_cmp(@accum, @temp2) = 0
' clean up
mpf_clear(@XX) : mpf_clear(@Term) : mpf_clear(@fac)
mpf_clear(@_x) : mpf_clear(@temp2) : mpf_clear(@pi2)
mpf_clear(@p)
Return accum
End Function
Function _tan Overload(x As mpf_t) As mpf_t
Dim As mpf_t s, c, ans
mpf_init(@ans)
s = _sin(x)
c = _cos(x)
mpf_div(@ans, @s, @c)
mpf_clear(@c) : mpf_clear(@s)
Return ans
End Function
Function _logTaylor(x As mpf_t) As mpf_t
'taylor series
'====================Log Guard==================
If mpf_cmp_ui(@x, 0) <= 0 Then Exit Function ' exit if x = 0 or x = negative
'===============================================
Dim As Integer invflag
Dim As Mpf_t Q, tmp, _x, accum, term, XX
mpf_init(@XX)
mpf_init(@Q)
mpf_init(@tmp)
mpf_init(@accum)
mpf_init(@term)
mpf_init_set(@_x, @x)
If mpf_cmp_ui(@_x, 1) < 0 Then
invflag = 1
mpf_ui_div(@_x, 1, @_x)
End If
mpf_sub_ui(@tmp, @_x, 1)
mpf_add_ui(@Q, @_x, 1) ' q = b
mpf_div(@accum,@tmp, @Q)
Mpf_set(@Q , @accum)
Mpf_mul(@XX, @Q, @Q)
Dim As Integer c=1
Do
c += 2
Mpf_swap(@tmp,@accum)
mpf_mul(@Q, @Q, @XX)
mpf_div_ui(@term, @Q, c)
mpf_add(@Accum, @tmp, @Term)
Loop Until Mpf_cmp(@tmp, @accum) = 0
mpf_mul_2exp(@accum, @accum, 1)
If invflag Then
mpf_neg(@accum, @accum)
End If
mpf_clear(@_x) : mpf_clear(@tmp) : mpf_clear(@Q)
mpf_clear(@XX) : mpf_clear(@term)
Return accum
End Function
Function _log Overload(x As mpf_t) As mpf_t
/'
'====================Log Guard==================
If Mpf_cmp_ui(@x, 0) <= 0 Then Exit Function ' exit if x = 0 or x is negative
'===============================================
Dim As mpf_t approx, ans, logx ',factor
Mpf_init_set(@approx, @x)
mpf_init(@ans)
mpf_sqrt(@approx, @approx) ' 1
mpf_sqrt(@approx, @approx) ' 2
mpf_sqrt(@approx, @approx) ' 3
logx = _logTaylor(approx)
mpf_mul_2exp(@ans, @logx, 3)
' clean up
mpf_clear(@approx) : mpf_clear(@logx)
'/
'====================Log Guard==================
If Mpf_cmp_ui(@x, 0) <= 0 Then Exit Function ' exit if x = 0 or x is negative
'===============================================
Dim As mpf_t approx, ans, logx ',factor
Mpf_init_set(@approx, @x)
mpf_init(@ans)
Dim As Integer c
While mpf_cmp_d(@approx, 1.25) > 0
mpf_sqrt(@approx, @approx)
c += 1
Wend
logx = _logTaylor(approx)
mpf_mul_2exp(@ans, @logx, c)
' clean up
mpf_clear(@approx) : mpf_clear(@logx)
Return ans
End Function
Function _exp Overload(x As mpf_t) As mpf_t
'taylor series
Dim As mpf_t fac, temp2, accum, p, term
mpf_init(@temp2)
mpf_init(@term)
mpf_init_set_ui(@fac, 1)
mpf_init_set_ui(@p, 1)
mpf_init_set_ui(@accum, 1)
Dim As Integer c
Do
c += 1
Mpf_swap(@temp2, @accum)
mpf_mul_ui(@fac, @fac, c)
mpf_mul(@p, @p, @x)
mpf_div(@term, @p, @fac)
mpf_add(@Accum, @temp2, @Term)
Loop Until Mpf_cmp(@accum, @temp2) = 0
' clean up
mpf_clear(@temp2) : mpf_clear(@fac)
mpf_clear(@term) : mpf_clear(@p)
Return accum
End Function
Function power Overload(a As mpf_t,p As mpf_t) As mpf_t
'a^p= exp(p*log(a))
'====================Power Guard==================
If Mpf_cmp_ui(@a, 0) <= 0 Then Exit Function ' exit if x = 0 or x is negative
'=================================================
Dim As mpf_t loga, product, ans
mpf_init(@product)
loga = _log(a)
mpf_mul(@product, @p, @loga)
ans = _exp(product)
'clean up
mpf_clear(@loga) : mpf_clear(@product)
Return ans
End Function
Function _Atn Overload(x As mpf_t) As mpf_t
#Macro ArctanTaylor(decnum)
mpf_init(@XX)
mpf_init(@Term)
mpf_init(@Accum)
mpf_init_set(@mt, @decnum)
mpf_init_set(@p, @decnum)
mpf_mul(@XX, @mt, @mt)
mpf_neg(@XX, @XX)
Do
c += 2
mpf_mul(@p, @p, @XX)
mpf_div_ui(@Term, @p, c)
mpf_add(@Accum, @mt, @Term)
Mpf_swap(@mt, @Accum)
Loop Until Mpf_cmp(@mt, @accum) = 0
#EndMacro
Dim As UInteger c = 1
Dim As mpf_t XX, Term, Accum, mt, p, _temp, _temp2
mpf_init(@_temp)
mpf_init_set(@_temp2, @x)
Dim As Integer limit = 16
For z As Integer = 1 To limit
mpf_mul( @_temp, @_temp2, @_temp2)
mpf_add_ui(@_temp ,@_temp, 1)
mpf_sqrt( @_temp, @_temp)
mpf_add_ui(@_temp, @_temp, 1)
mpf_div( @_temp, @_temp2, @_temp)
Mpf_swap( @_temp, @_temp2)
Next z
ArctanTaylor(_temp)
mpf_mul_2exp(@mt, @mt, (limit -1))
mpf_clear(@_temp) : mpf_clear(@_temp2) : mpf_clear(@XX)
mpf_clear(@accum) : mpf_clear(@term) : mpf_clear(@p)
Return mt
End Function
Function _Acos Overload(x As mpf_t) As mpf_t
'ARCCOS = ATN(-x / SQR(-x * x + 1)) + 2 * ATN(1)
'============= ARCCOS GUARD =========
Dim As Mpf_t B : Mpf_init(@B)
Mpf_mul(@B, @x, @x) 'x*x
If Mpf_cmp_ui(@B, 1) > 0 Then
mpf_clear(@B) ' need to clean up B
Exit Function
End If
'====================================
Dim As Mpf_t atn1, term1, ans
Mpf_init_set_ui(@term1, 1)
Mpf_init(@ans)
atn1=_Atn(term1)
If Mpf_cmp_ui(@B, 1) = 0 Then
'for 1 and -1
If Mpf_cmp_si(@x, -1) = 0 Then
Mpf_mul_2exp(@ans, @atn1, 2)
End If
mpf_clear(@B) : mpf_clear(@atn1) : mpf_clear(@term1)
' ans = pi or 0
Return ans
End If
Dim As Mpf_t tail, T, atnterm1
mpf_init(@tail)
mpf_init(@T)
mpf_mul_2exp(@tail, @atn1, 1) ' 2*atn(1)
mpf_neg(@T, @x) ' -x
'mpf_mul(@B,@x,@x) ' x*x ' done at the begin
mpf_ui_sub(@B, 1, @B) ' 1 - x*x
mpf_sqrt(@B, @B) ' sqr(1 - x*x)
mpf_div(@term1, @T, @B)
atnterm1 = _Atn(term1)
mpf_add(@ans, @atnterm1, @tail)
'clean up
mpf_clear(@B) : mpf_clear(@atn1) : mpf_clear(@term1)
mpf_clear(@T) : mpf_clear(@tail) : mpf_clear(@atnterm1)
Return ans
End Function
Function _Asin Overload(x As mpf_t) As mpf_t
' ARCSIN = ATN(x / SQR(-x * x + 1))
'============= ARCSIN GUARD =========
Dim As Mpf_t B : Mpf_init(@B)
Mpf_mul(@B, @x, @x) 'x*x
If Mpf_cmp_ui(@B, 1) > 0 Then
mpf_clear(@B)
Exit Function
End If
'====================================
Dim As mpf_t term1
mpf_init_set_ui(@term1, 1)
'for 1 and -1
If Mpf_cmp_ui(@B, 1) = 0 Then
Dim As mpf_t atn1
atn1 = _Atn(term1)
mpf_mul_2exp(@atn1, @atn1, 1)
If mpf_cmp_si(@x, -1) = 0 Then
mpf_neg(@atn1, @atn1)
End If
' clean up
mpf_clear(@B) : mpf_clear(@term1)
Return atn1
End If
Dim As Mpf_t T, atnterm1
Mpf_init_set(@T, @x)
mpf_ui_sub(@B, 1, @B) '1 - x*x
mpf_sqrt(@B, @B) 'sqr(1 - x*x)
mpf_div(@term1, @T, @B)
atnterm1 = _Atn(term1)
' clean up
mpf_clear(@B) : mpf_clear(@T) : mpf_clear(@term1)
Return atnterm1
End Function
'===========================================================================
'======================= OVERLOADS FOR STRINGS =============================
Dim Shared As ZString * 10000000 outtext
Function Pi_ui Overload(places As Integer) As String
Dim As Mpf_t ans
Var pl=CUInt(places)
ans=Pi_ui(pl)
gmp_sprintf(@outtext, "%." & pl & "Ff", @ans )
mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _sin Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x, x, 10)
ans = _sin(_x)
gmp_sprintf(@outtext, "%." & precision & "Ff", @ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _cos Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x,x,10)
ans = _cos(_x)
gmp_sprintf(@outtext, "%." & precision & "Ff", @ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _tan Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x,x,10)
ans = _tan(_x)
gmp_sprintf( @outtext, "%." & precision & "Ff", @ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _log Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x,x,10)
ans = _log(_x)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _exp Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x, x, 10)
ans = _exp(_x)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function power Overload(a As String,p As String) As String
Dim As Mpf_t _x, ans, pow
mpf_init_set_str(@_x, a, 10)
mpf_init_set_str(@pow, p, 10)
ans = power(_x, pow)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans) : mpf_clear(@pow)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _Atn Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x, x, 10)
ans = _Atn(_x)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _Acos Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x, x, 10)
ans = _Acos(_x)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function _Asin Overload(x As String) As String
Dim As Mpf_t _x, ans
mpf_init_set_str(@_x, x, 10)
ans = _Asin(_x)
gmp_sprintf( @outtext,"%." & precision & "Ff",@ans )
mpf_clear(@_x) : mpf_clear(@ans)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function factorial(n As UInteger) As String 'Automatic precision
Dim As __mpz_struct Intanswer
mpz_init( @Intanswer)
mpz_fac_ui(@Intanswer,n)
gmp_sprintf( @outtext,"%Zi", @Intanswer )
mpz_clear(@Intanswer)
Return Trim(outtext)
End Function
Function _mod(n1 As String,n2 As String) As String
Dim As __mpz_struct answer, mn1, mn2
mpz_init(@answer)
mpz_init_set_str(@mn1, n1, 10)
mpz_init_set_str(@mn2, n2, 10)
mpz_mod(@answer, @mn1, @mn2)
gmp_sprintf( @outtext,"%Zi", @answer )
mpz_clear(@answer) : mpz_clear(@mn1) : mpz_clear(@mn2)
Return Trim(outtext)
End Function
Function _div(n1 As String,n2 As String) As String
Dim As __mpz_struct answer, mn1, mn2
mpz_init(@answer)
mpz_init_set_str(@mn1, n1, 10)
mpz_init_set_str(@mn2, n2, 10)
mpz_div(@answer, @mn1, @mn2)
gmp_sprintf( @outtext,"%Zi", @answer )
mpz_clear(@answer) : mpz_clear(@mn1) : mpz_clear(@mn2)
Return Trim(outtext)
End Function
Function Sqrroot(number As String,decimals As UInteger=PRECISION) As String'precision parameter
If InStr(number,"-") Then Exit Function
Dim As __mpf_struct num, FloatAnswer
Dim As Integer LN = Len(number)
mpf_init2(@num, 4*Ln) : mpf_init2(@FloatAnswer, 4*Ln+4*decimals)
mpf_set_str(@num, number, 10)
mpf_sqrt( @FloatAnswer, @num)
gmp_sprintf( @outtext,"%." & Str(decimals) & "Ff",@FloatAnswer )
mpf_clear(@num) : mpf_clear(@FloatAnswer)
Return Trim(outtext)
End Function
Function mult(number1 As String,number2 As String) As String'Automatic precision
Dim As Integer Ln1 = Len(number1), Ln2 = Len(number2)
Dim As __mpf_struct num1,num2,FloatAnswer
mpf_init2(@num1, 4*(Ln1+Ln2+1) )
mpf_init2(@num2, 4*(Ln1+Ln2+1) )
mpf_init2(@Floatanswer, 4*(Ln1+Ln2+1))
Ln1=InStr(1, number1, ".") : Ln2 = InStr(1, number2, ".")
Var decimals = Len(Mid(number1, Ln1+1))+Len(Mid(number2, Ln2+1))+1
mpf_set_str(@num1, number1, 10)
mpf_set_str(@num2, number2, 10)
mpf_mul(@Floatanswer, @num1, @num2)
gmp_sprintf( @outtext,"%." & Str(decimals) & "Ff",@FloatAnswer )
mpf_clear(@num1) : mpf_clear(@num2) : mpf_clear(@FloatAnswer)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
'precision parameter
Function divide(number1 As String,number2 As String,decimals As UInteger=PRECISION) As String
Dim As Integer Ln1=Len(number1),Ln2=Len(number2),Ln
If Ln1>=Ln2 Then Ln=Ln1 Else Ln=Ln2
Dim As __mpf_struct num1,num2,FloatAnswer
mpf_init2(@num1, 4*(Ln+1) )
mpf_init2(@num2, 4*(Ln+1) )
mpf_init2(@Floatanswer, 4*(Ln+1)+4*decimals)
mpf_set_str(@num1, number1, 10)
mpf_set_str(@num2, number2, 10)
mpf_div(@Floatanswer, @num1, @num2)
gmp_sprintf( @outtext,"%." & Str(decimals) & "Ff",@FloatAnswer)
mpf_clear(@num1) : mpf_clear(@num2) : mpf_clear(@FloatAnswer)
Return Trim(outtext)
End Function
Function power Overload(number As String, n As UInteger) As String'automatic precision
#Define dp 3321921
Dim As __mpf_struct _number, FloatAnswer
Dim As ULongInt ln=Len(number)*(n)*4
If ln>dp Then ln=dp
mpf_init2(@FloatAnswer, ln)
mpf_init2(@_number, ln) 'or 4*len(number)
mpf_set_str(@_number, number, 10)
mpf_pow_ui(@Floatanswer, @_number, n)
gmp_sprintf( @outtext,"%." & Str(n) & "Ff",@FloatAnswer )
mpf_clear(@_number) : mpf_clear(@FloatAnswer)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function plus(number1 As String,number2 As String) As String'automatic precision
Dim As Integer Ln1=Len(number1),Ln2=Len(number2),decimals,Ln
If Ln1>=Ln2 Then Ln=Ln1 Else Ln=Ln2
Ln=ln+1
Dim As __mpf_struct num1,num2,FloatAnswer
mpf_init2(@num1, 4*(Ln1+1) )
mpf_init2(@num2, 4*(Ln2+1) )
mpf_init2(@Floatanswer, 4*(Ln))
mpf_set_str(@num1,number1,10)
mpf_set_str(@num2,number2,10)
Ln1=InStr(1,number1,"."):Ln2=InStr(1,number2,".")
If Ln1 Or Ln2 Then
decimals=Len(Mid(number1,Ln1+1))+Len(Mid(number2,Ln2+1))+1
End If
mpf_add(@Floatanswer, @num1, @num2)
gmp_sprintf( @outtext,"%." & Str(decimals) & "Ff",@FloatAnswer )
mpf_clear(@num1) : mpf_clear(@num2) : mpf_clear(@FloatAnswer)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function minus(number1 As String,number2 As String) As String'automatic precision
Dim As Integer Ln1=Len(number1),Ln2=Len(number2),decimals,Ln
If Ln1>=Ln2 Then Ln=Ln1 Else Ln=Ln2
Ln=ln+1
Dim As __mpf_struct num1, num2, FloatAnswer
mpf_init2(@num1, 4*(Ln1+1) )
mpf_init2(@num2, 4*(Ln2+1) )
mpf_init2(@Floatanswer, 4*(Ln))
mpf_set_str(@num1, number1, 10)
mpf_set_str(@num2, number2, 10)
Ln1=InStr(1,number1,"."):Ln2=InStr(1,number2,".")
If Ln1 Or Ln2 Then
decimals=Len(Mid(number1,Ln1+1))+Len(Mid(number2,Ln2+1))+1
End If
mpf_sub(@Floatanswer, @num1, @num2)
gmp_sprintf( @outtext,"%." & Str(decimals) & "Ff",@FloatAnswer )
mpf_clear(@num1) : mpf_clear(@num2) : mpf_clear(@FloatAnswer)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function Absolute Overload(a As String) As String
Dim As __mpf_struct Ab, Floatanswer
mpf_init2(@FloatAnswer, 4*precision )
mpf_init2(@Ab, 4*precision )
mpf_set_str(@Ab, a, 10)
mpf_abs(@FloatAnswer, @Ab)
gmp_sprintf( @outtext,"%." & Str(precision) & "Ff",@FloatAnswer )
mpf_clear(@Ab) : mpf_clear(@FloatAnswer)
Var outtxt=Trim(outtext)
If InStr(outtxt,".") Then outtxt= RTrim(outtxt,"0"):outtxt=RTrim(outtxt,".")
Return Trim(outtxt)
End Function
Function greater Overload(a As String,b As String) As Integer
Dim As mpf_t ma, mb
mpf_init2(@ma, 4*precision)
mpf_init2(@mb, 4*precision)
mpf_set_str(@ma, a, 10)
mpf_set_str(@mb, b, 10)
Return greater(ma,mb)
End Function
Function equals Overload(a As String,b As String) As Integer
Dim As mpf_t ma, mb
mpf_init2(@ma, 4*precision)
mpf_init2(@mb, 4*precision)
mpf_set_str(@ma, a, 10)
mpf_set_str(@mb, b, 10)
Return equals(ma, mb)
End Function
Function less Overload(a As String,b As String) As Integer
If equals(a,b) Then Return 0
If greater(a,b) Then Return 0
Return -1
End Function
'======================== TESTS ===============================
set_precision(90)
Print "GMP version "; *gmp_version
Print Pi_ui(100);tab(105);" Pi_ui(100)"
Print _sin("1");tab(105);" _sin(1)"
Print _cos("1");tab(105);" _cos(1)"
Print _tan("1");tab(105);" _tan(1)"
Print _log("12.88");tab(105);" _log(12.88)"
Print _exp("1");tab(105);" _exp(1)"
Print power("5","-.5");tab(105);" power(5,-.5)"
Print
Print _Asin(".5");tab(105);" _Asin(.5)"
Print _Acos(".5");tab(105);" _Acos(.5)"
Print _Atn("1000");tab(105);" _Atn(1000)"
Print factorial(50);tab(105);" factorial(50)"
Print Sqrroot("2");tab(105);" sqrroot(2)"
Print mult("123","10000.888");tab(95);" mult(123,10000.888)"
Print divide("1.0096","1023",70);tab(95);" divide(1.0096,1023,70))"
Print power("2",200);tab(105);" power(2,200)"
Print plus("100","200");tab(105);" Plus(100,200)"
Print minus("100","200");tab(105);" Minus(100,200)"
Print Absolute("-67");tab(105);" absolute(-67)"
Print _mod("1999012345678987654321","414");tab(80);" _mod(1999012345678987654321,414)"
Print _div("1999012345678987654321","414");tab(80);" _div(1999012345678987654321,414)"
Sleep
Code: Select all
GMP version 6.1.1
3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117068 Pi_ui(100)
0.841470984807896506652502321630298999622563060798371065672751709991910404391239668948639744 _sin(1)
0.540302305868139717400936607442976603732310420617922227670097255381100394774471764517951856 _cos(1)
1.557407724654902230506974807458360173087250772381520038383946605698861397151727289555099965 _tan(1)
2.555675720676207556127819030259177137103762470245516740753409753965608755291246752331655162 _log(12.88)
2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382179 _exp(1)
0.447213595499957939281834733746255247088123671922305144854179449082104185127560979882882882 power(5,-.5)
0.523598775598298873077107230546583814032861566562517636829157432051302734381034833104672471 _Asin(.5)
1.047197551196597746154214461093167628065723133125035273658314864102605468762069666209344942 _Acos(.5)
1.569796327128229752564797882004830898086963765133284897396041247966262730802434937022743938 _Atn(1000)
30414093201713378043612608166064768844377641568960512000000000000 factorial(50)
1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534 sqrroot(2)
1230109.224 mult(123,10000.888)
0.0009869012707722385141739980449630034483641390379151376584269357329671 divide(1.0096,1023,70))
1606938044258990275541962092341162602522202993782792835301376 power(2,200)
300 Plus(100,200)
-100 Minus(100,200)
67 absolute(-67)
37 _mod(1999012345678987654321,414)
4828532235939583706 _div(1999012345678987654321,414)
Line 421 of which file? I don't recall seeing a name in your sample. I wonder why a fix length string? I have been working with numbers which may have over 60 integer digits.dodicat wrote:Here are some functions for gmp for you to test.
The first instance of __mpz_struct is in factorial.
The max output length string is 10000000.
If you need more then goto line 421 to reset.
Code: Select all
'======================= OVERLOADS FOR STRINGS =============================
Dim Shared As ZString * 10000000 outtext ' *** this is line 421 ***
Let's see. No errors using the compiler from the command line on either machine. The compiled program from my Windows 10 system crashes on the Windows 7 system. I only compiled code without comments.srvaldez wrote:@storm5510
I think that we may have a misunderstanding of terms, when you say that the program crashes at mpz_init(@p) does that mean that the program successfully compiled (without your commenting-out) and then crashed when you run the executable?
or do you get errors when trying to compile the program?
if so, then please post the error messages.
also, if you run the executable from your Windows 10 on the Windows 7 PC, does it crash or run OK?
VM is Virtual Machine. I just looked this up. it is an add-on which I do not have on my HP. I found it on the MS website and downloaded the 64 bit model. I will give it a try to see if it makes a difference.srvaldez wrote:FB comes in 32-bit and 64-bit versions
I tried to cover all possible issues but I can't see what's going on your PC's, it works fine here on a Windows 7 x64 VM
I cannot use a VM on my HP. It doesn't have virtualization technology. It is too old, 2012. The same probably applies to my laptop. Both are 64-bit machines using a 64-bit installation, and they run quite well. My i7 system with Window 10 Pro x64 runs the program without any problems. There are other options. Using another language, like Perl. I have been dabbling with it for a month or so.caseih wrote:srvaldez doesn't mean you need a virtual machine. But virtual machines are good for testing since you can install different operating system versions to see how they work. All he meant was it worked when he used the 64-bit version of FB on his 64-bit Windows 7 installation, which happens to be in a VM, so that likely rules out Windows 7 64-bit itself being the culprit.