Page 1 of 1

"Exact" Calculations...

Posted: Mon May 08, 2006 7:46 am
by Michael Vogel
Hi, I need really help now - my nephew has a problem in school to do a precise calculation of a math term:

result = rho . h . delta r^4 . delta phi . n . Sum [(2*j-1)/2 ]^3 j:1...n

So I wrote (quick and dirty and SLOOOW!) procedures for "+", "-" and "*" which do calculations of numbers stored into strings...

The routines ignore signs (should be changed in the future, for now the formula above it is not important) and they are all very slow.

So my question - has anyone done something like this already for Purebasic (V4)? Maybe in assembler? I need to speed up the program very urgently...

Code: Select all

; Define

	;Procedure.d summe(a.d,b.d)
	;	Protected sum.d=0
	;	Protected j.d=a
	;	While j<=b
	;		sum+Pow((2*j-1)/2,3)
	;		j+1
	;	Wend
	;	ProcedureReturn sum
	;EndProcedure
	;
	;Global h.d=0.5
	;Global D1.d=4.3
	;Global D2.d=3.8
	;Global rho.d=7800
	;
	;Global n.d=360
	;Global m.d=10000
	;
	;Global delta_r.d=D1/2/m
	;Global delta_phi.d=360/n*#PI/180
	;
	;Debug rho*h*Pow(delta_r,4)*delta_phi*n*summe(1,m)

	EnableExplicit

	Global max
	Global Pi.s="3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949129833673362440656643086021394946395224737190702179860943702770539217176293176752384674818467669405132000568127145263560827785771342757789609173637178721468440901224953430146549585371050792279689258923542019956112129021960864034418159813629774771309960518707211349999998372978049951059731732816096318595024459455346908302642522308253344685035261931188171010003137838752886587533208381420617177669147303598253490428755468731159562863882353787593751957781857780532171226806613001927876611195909216420199"

	Global h.s
	Global D1.s
	Global D2.s
	Global rho.s
	Global einsdurchm.s
	Global delta_r.s
	Global zweipi.s
	Global power.s
	Global ergebnis.s

	Global mstellen
	Global m.q

	Enumeration
		#h
		#D
		#rho
		#m
		#mstellen
		#max
		#maxstellen
		#go
		#output
	EndEnumeration

	Global Ausgabe.s
	Global Abort
	Global Active
	Global win
; EndDefine

Procedure.s Normalize(zahl.s)
	If FindString(zahl,".",1)=0
		zahl+"."
	EndIf
	ProcedureReturn zahl
EndProcedure
Procedure.s AddLeadingZeros(zahl.s,n)
	ProcedureReturn LSet("",n,"0")+zahl
EndProcedure
Procedure.s AddTrailingZeros(zahl.s,n)
	ProcedureReturn zahl+LSet("",n,"0")
EndProcedure
Procedure.s StripZeros(zahl.s)
	Protected i=0
	Protected komma=FindString(zahl,".",1)

	If komma>2
		While (i<komma-2) And (PeekB(@zahl+i)='0')
			i+1
		Wend
		If i>0
			zahl=Mid(zahl,i+1,#MAXSHORT)
			komma-i
		EndIf
	EndIf
	i=Len(zahl)-1
	While (i>komma) And (PeekB(@zahl+i)='0')
		i-1
	Wend
	zahl=Left(zahl,i+1)
	ProcedureReturn zahl
EndProcedure

Procedure.s Add(a.s,b.s)

	Protected i
	Protected k
	Protected s
	Protected sum.s

	a=Normalize(a)
	b=Normalize(b)
	Protected komm_a=FindString(a,".",1)
	Protected komm_b=FindString(b,".",1)

	If komm_a>komm_b : Swap a,b : Swap komm_a,komm_b :EndIf

	a=AddLeadingZeros(a,komm_b-komm_a+1)
	b=AddLeadingZeros(b,1)

	Protected len_a=Len(a)
	Protected len_b=Len(b)

	If len_a<len_b
		a=AddTrailingZeros(a,len_b-len_a)
	Else
		b=AddTrailingZeros(b,len_a-len_b)
	EndIf

	i=Len(a)
	k=FindString(a,".",1)-1
	s=0
	sum=Space(i)

	While i
		i-1
		If i=k
			PokeB(@sum+i,'.')
		Else
			s+PeekB(@a+i)+PeekB(@b+i)-96
			PokeB(@sum+i,s%10+48)
			s=s/10
		EndIf
	Wend

	ProcedureReturn StripZeros(sum)
EndProcedure
Procedure.s Sub(a.s,b.s)

	Protected i
	Protected k
	Protected s
	Protected sub.s

	a=Normalize(a)
	b=Normalize(b)
	Protected komm_a=FindString(a,".",1)
	Protected komm_b=FindString(b,".",1)

	If komm_a<komm_b
		a=AddLeadingZeros(a,komm_b-komm_a)
	Else
		b=AddLeadingZeros(b,komm_a-komm_b)
	EndIf

	Protected len_a=Len(a)
	Protected len_b=Len(b)

	If len_a<len_b
		a=AddTrailingZeros(a,len_b-len_a)
	Else
		b=AddTrailingZeros(b,len_a-len_b)
	EndIf

	;	Debug a
	;	Debug b

	i=Len(a)
	k=FindString(a,".",1)-1
	s=0
	sub=Space(i)

	While i
		i-1
		If i=k
			PokeB(@sub+i,'.')
		Else
			s=PeekB(@a+i)-PeekB(@b+i)-s
			If s<0
				PokeB(@sub+i,s+58)
				s=1
			Else
				PokeB(@sub+i,s+48)
				s=0
			EndIf
		EndIf
	Wend

	ProcedureReturn StripZeros(sub)
EndProcedure
Procedure.s Mul(a.s,b.s)

	Protected lena,lenb
	Protected summe=0
	Protected mul.s

	a=Normalize(a)
	b=Normalize(b)
	Protected komm_a=FindString(a,".",1)
	Protected komm_b=FindString(b,".",1)

	a=Left(a,komm_a-1)+Mid(a,komm_a+1,#MAXSHORT)
	b=Left(b,komm_b-1)+Mid(b,komm_b+1,#MAXSHORT)

	lena=Len(a)
	lenb=Len(b)

	mul=LSet("0",lena+lenb,"0")

	Repeat
		lena-1
		lenb=Len(b)
		Repeat
			lenb-1
			If lena+lenb<max

				summe=(PeekB(@a+lena)-48)*(PeekB(@b+lenb)-48)+(PeekB(@mul+lena+lenb+1)-48);Puffer(lena+lenb+1)
				;Puffer(lena+lenb+1)=summe%10
				;Puffer(lena+lenb)+summe/10
				PokeB(@mul+lena+lenb+1,summe%10+48)
				PokeB(@mul+lena+lenb,PeekB(@mul+lena+lenb)+summe/10)
			EndIf
		Until lenb=0

	Until lena = 0

	ProcedureReturn StripZeros(Left(mul,komm_a+komm_b-2)+"."+Mid(mul,komm_a+komm_b-1,#MAXSHORT))

EndProcedure

Procedure.s Sigma(a.q,b.q)

	Protected sum.s="0"
	Protected j.s
	Protected c.s

	Protected i.q

	i=a
	While i<=b

		j=StrQ(i)
		j=sub(j,"0.5")
		c=j
		j=mul(j,c)
		j=mul(j,c)
		sum=add(sum,j)
		i+1

		If i%5000=0
			SetGadgetText(#output,Ausgabe+StrQ(i))
			UpdateWindow_(win)
			If (WindowEvent()=#PB_Event_Gadget) And (EventGadget()=#go) : Abort=#True : EndIf
			If Abort
				i=b
			EndIf
		EndIf

	Wend

	ProcedureReturn sum
EndProcedure

Procedure Calc()

rho=GetGadgetText(#rho)
D1=GetGadgetText(#d)
h=GetGadgetText(#h)
	Abort=0


	SetGadgetText(#go,"Abbruch")

	delta_r=mul(D1,"0.5")
	delta_r=mul(delta_r,einsdurchm)
	;Debug "Delta r: "+delta_r

	power=mul(delta_r,delta_r)
	power=mul(power,power)
	;Debug "Power: "+power

	ergebnis=mul(rho,h)
	;Debug "Rho*h: "+ergebnis

	ergebnis=mul(ergebnis,power)
	;Debug "Rho*h*Power: "+ergebnis

	zweipi=mul("2",Pi)
	ergebnis=mul(ergebnis,zweipi)

	;Debug ergebnis
	ergebnis=mul(ergebnis,sigma(1,m))

	SetClipboardText(ergebnis)

	Ausgabe=Ausgabe+Left(ergebnis,50)+"...  "
	If Abort
		Ausgabe+"abgebrochen"
	Else
		Ausgabe+"m = 10^"+Str(mstellen)
	EndIf

	Ausgabe+#CRLF$

	SetGadgetText(#output,Ausgabe)
	;Debug rho*h*Pow(delta_r,4)*delta_phi*n*summe(1,m)

	SetGadgetText(#go,"Start")

EndProcedure

Procedure Win()
	Protected quit=0

	win=OpenWindow(1,0,0,640,290,"Kalkulation",#PB_Window_Invisible|#WS_THICKFRAME|#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
	CreateGadgetList(win)

	TextGadget(901,10,23,50,20,"h:")
	TextGadget(902,10,53,50,20,"D:")
	TextGadget(903,10,83,50,20,"rho:")
	TextGadget(904,10,113,50,20,"m:")
	TextGadget(905,10,178,50,20,"Stellen:")

	StringGadget(#h,50,20,135,22,h)
	StringGadget(#D,50,50,135,22,D1)
	StringGadget(#rho,50,80,135,22,rho)

	StringGadget(#m,50,110,135,22,"")
	DisableGadget(#m,1)
	TrackBarGadget(#mstellen, 50,135,135,22, 1, 10,#PB_TrackBar_Ticks)

	StringGadget(#max,50,175,135,22,"")
	DisableGadget(#max,1)
	TrackBarGadget(#maxstellen, 50,200,135,22,1,100)

	SetGadgetState(#mstellen,mstellen)
	m=Pow(10,mstellen)
	einsdurchm=LSet("0.",mstellen+1,"0")+"1"
	SetGadgetText(#m,StrQ(m))

	SetGadgetState(#maxstellen,max/100)
	SetGadgetText(#max,Str(max))

	ButtonGadget(#go,10,240,175,30,"Start")

	EditorGadget(#output,220,20,400,250,#PB_Editor_ReadOnly)
	;DisableGadget(#output,1)


	SetTimer_(win,1,200,0)
	StickyWindow(1,1)
	HideWindow(1,0)

	Repeat
		Select WaitWindowEvent()

		Case #PB_Event_Gadget

			Select EventGadget()
			Case #mstellen
				mstellen=GetGadgetState(#mstellen)
				m=Pow(10,mstellen)
				einsdurchm=LSet("0.",mstellen+1,"0")+"1"
				SetGadgetText(#m,StrQ(m))
			Case #maxstellen
				max=GetGadgetState(#maxstellen)*100
				SetGadgetText(#max,Str(max))

			Case #go
				If Active
					abort=#True
				Else
					Active=#True
					Calc()
					Active=#False
				EndIf

			EndSelect

		Case #PB_Event_CloseWindow
			quit=1

		EndSelect
	Until quit

EndProcedure
Procedure Main()
	h="0.5"
	D1="4.3"
	D2="3.8"
	rho="7800"

	max=100
	mstellen=1

	Win()
EndProcedure

Main()


Posted: Mon May 08, 2006 11:16 am
by jack
you could use GMP, compiled dll's are available at ftp://deltatrinity.dyndns.org/ gmp-4.2 is latest version.
also get the import lib ->libgmp-3.lib
Image
get the gmp manual http://www.swox.com/gmp/
here's an example of use, donn't have time to comment, got to go work.

Code: Select all


;you can download gmp from ftp://deltatrinity.dyndns.org/

Structure mpz ; multiprecision integer 
  mp_alloc.l 
  mp_size.l 
  mp_limb.l 
EndStructure 

Structure mpq ; multiprecision rational 
  mp_num.mpz 
  mp_den.mpz 
EndStructure 

Structure mpf ; multiprecision floating point 
  mp_prec.l 
  mp_size.l 
  mp_expt.l 
  mp_limb.l 
EndStructure 

ImportC "libgmp-3.lib"
  gmp_sprintz.l(dest.s,format.s,*n.mpz) As "___gmp_sprintf"
  gmp_sprintq.l(dest.s,format.s,*n.mpq) As "___gmp_sprintf"
  gmp_sprintf.l(dest.s,format.s,*n.mpf) As "___gmp_sprintf"
  mpf_set_default_prec(prec.l) As "___gmpf_set_default_prec"
  mpf_get_default_prec.l() As "___gmpf_get_default_prec"
  mpf_init(*x.mpf) As "___gmpf_init"
  mpf_init2(*x.mpf,prec.l) As "___gmpf_init2"
  mpf_clear(*x.mpf) As "___gmpf_clear"
  mpf_get_prec.l(*op.mpf) As "___gmpf_get_prec"
  mpf_set_prec(*rop.mpf,prec.l) As "___gmpf_set_prec"
  mpf_set_prec_raw(*rop.mpf,prec.l) As "___gmpf_set_prec_raw"
  mpf_set(*rop.mpf,*op.mpf) As "___gmpf_set"
  mpf_set_ui(*rop.mpf,op.l) As "___gmpf_set_ui"
  mpf_set_si(*rop.mpf,op.l) As "___gmpf_set_si"
  mpf_set_d(*rop.mpf,op.d) As "___gmpf_set_d"
  mpf_set_z(*rop.mpf,*op.mpz) As "___gmpf_set_z"
  mpf_set_q(*rop.mpf,*op.mpq) As "___gmpf_set_q"
  mpf_set_str.l(*rop.mpf,str.s,base.l) As "___gmpf_set_str"
  mpf_swap(*rop1.mpf,*rop2.mpf) As "___gmpf_swap"
  mpf_init_set(*rop.mpf,*op.mpf) As "___gmpf_init_set"
  mpf_init_set_ui(*rop.mpf,op.l) As "___gmpf_init_set_ui"
  mpf_init_set_si(*rop.mpf,op.l) As "___gmpf_init_set_si"
  mpf_init_set_d(*rop.mpf,op.d) As "___gmpf_init_set_d"
  mpf_init_set_str.l(*rop.mpf,str.s,base.l) As "___gmpf_init_set_str"
  mpf_get_d.d(*op.mpf) As "___gmpf_get_d"
  mpf_get_d_2exp.d(expt.l,*op.mpf) As "___gmpf_get_d_2exp"
  mpf_get_si.l(*op.mpf) As "___gmpf_get_si"
  mpf_get_ui.l(*op.mpf) As "___gmpf_get_ui"
  mpf_get_str.s(str.s,expptr.l,base.l,n_digits.l,*op.mpf) As "___gmpf_get_str"
  mpf_ceil(*rop.mpf,*op.mpf) As "___gmpf_ceil"
  mpf_floor(*rop.mpf,*op.mpf) As "___gmpf_floor"
  mpf_trunc(*rop.mpf,*op.mpf) As "___gmpf_trunc"
  mpf_integer_p.l(*op.mpf) As "___gmpf_integer_p"
  mpf_fits_ulong_p.l(*op.mpf) As "___gmpf_fits_ulong_p"
  mpf_fits_slong_p.l(*op.mpf) As "___gmpf_fits_slong_p"
  mpf_fits_uint_p.l(*op.mpf) As "___gmpf_fits_uint_p"
  mpf_fits_sint_p.l(*op.mpf) As "___gmpf_fits_sint_p"
  mpf_fits_ushort_p.l(*op.mpf) As "___gmpf_fits_ushort_p"
  mpf_fits_sshort_p.l(*op.mpf) As "___gmpf_fits_sshort_p"
  mpf_add(*rop.mpf,*op1.mpf,*op2.mpf) As "___gmpf_add"
  mpf_add_ui(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_add_ui"
  mpf_sub(*rop.mpf,*op1.mpf,*op2.mpf) As "___gmpf_sub"
  mpf_ui_sub(*rop.mpf,op1.l,*op2.mpf) As "___gmpf_ui_sub"
  mpf_sub_ui(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_sub_ui"
  mpf_mul(*rop.mpf,*op1.mpf,*op2.mpf) As "___gmpf_mul"
  mpf_mul_ui(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_mul_ui"
  mpf_div(*rop.mpf,*op1.mpf,*op2.mpf) As "___gmpf_div"
  mpf_ui_div(*rop.mpf,op1.l,*op2.mpf) As "___gmpf_ui_div"
  mpf_div_ui(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_div_ui"
  mpf_sqrt(*rop.mpf,*op.mpf) As "___gmpf_sqrt"
  mpf_sqrt_ui(*rop.mpf,op.l) As "___gmpf_sqrt_ui"
  mpf_pow_ui(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_pow_ui"
  mpf_neg(*rop.mpf,*op.mpf) As "___gmpf_neg"
  mpf_abs(*rop.mpf,*op.mpf) As "___gmpf_abs"
  mpf_mul_2exp(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_mul_2exp"
  mpf_div_2exp(*rop.mpf,*op1.mpf,op2.l) As "___gmpf_div_2exp"
  mpf_cmp.l(*op1.mpf,*op2.mpf) As "___gmpf_cmp"
  mpf_cmp_d.l(*op1.mpf,op2.d) As "___gmpf_cmp_d"
  mpf_cmp_ui.l(*op1.mpf,op2.l) As "___gmpf_cmp_ui"
  mpf_cmp_si.l(*op1.mpf,op2.l) As "___gmpf_cmp_si"
  mpf_eq.l(*op1.mpf,*op2.mpf,op3.l) As "___gmpf_eq"
  mpf_reldiff(*rop.mpf,*op1.mpf,*op2.mpf) As "___gmpf_reldiff"
  mpf_sgn.l(*op.mpf) As "___gmpf_sgn"
  gmp_snprintf.l(buf.s,size.l,fmt.s,*op.mpf) As "___gmp_snprintf"
  mpz_init(*integer.mpz) As "___gmpz_init"
  mpz_init2(*integer.mpz,n.l) As "___gmpz_init2"
  mpz_clear(*integer.mpz) As "___gmpz_clear"
  mpz_realloc2(*integer.mpz,n.l) As "___gmpz_realloc2"
;  mpz_realloc.l(*integer.mpz,) As "____gmpz_realloc"
  mpz_set(*rop.mpz,*op.mpz) As "___gmpz_set"
  mpz_set_ui(*rop.mpz,op.l) As "___gmpz_set_ui"
  mpz_set_si(*rop.mpz,op.l) As "___gmpz_set_si"
  mpz_set_d(*rop.mpz,op.d) As "___gmpz_set_d"
  mpz_set_q(*rop.mpz,*op.mpq) As "___gmpz_set_q"
  mpz_set_f(*rop.mpz,*op.mpf) As "___gmpz_set_f"
  mpz_set_str.l(*rop.mpz,str.s,base.l) As "___gmpz_set_str"
  mpz_swap(*rop1.mpz,*rop2.mpz) As "___gmpz_swap"
  mpz_init_set(*rop.mpz,*op.mpz) As "___gmpz_init_set"
  mpz_init_set_ui(*rop.mpz,op.l) As "___gmpz_init_set_ui"
  mpz_init_set_si(*rop.mpz,op.l) As "___gmpz_init_set_si"
  mpz_init_set_d(*rop.mpz,op.d) As "___gmpz_init_set_d"
  mpz_init_set_str.l(*rop.mpz,str.s,base.l) As "___gmpz_init_set_str"
  mpz_add(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_add"
  mpz_add_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_add_ui"
  mpz_sub(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_sub"
  mpz_sub_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_sub_ui"
  mpz_ui_sub(*rop.mpz,op1.l,*op2.mpz) As "___gmpz_ui_sub"
  mpz_mul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_mul"
  mpz_mul_si(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_mul_si"
  mpz_mul_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_mul_ui"
  mpz_addmul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_addmul"
  mpz_addmul_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_addmul_ui"
  mpz_submul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_submul"
  mpz_submul_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_submul_ui"
  mpz_mul_2exp(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_mul_2exp"
  mpz_neg(*rop.mpz,*op.mpz) As "___gmpz_neg"
  mpz_abs(*rop.mpz,*op.mpz) As "___gmpz_abs"
  mpz_cdiv_q(*q.mpz,*n.mpz,*d.mpz) As "___gmpz_cdiv_q"
  mpz_cdiv_r(*r.mpz,*n.mpz,*d.mpz) As "___gmpz_cdiv_r"
  mpz_cdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As "___gmpz_cdiv_qr"
  mpz_cdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As "___gmpz_cdiv_q_ui"
  mpz_cdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As "___gmpz_cdiv_r_ui"
  mpz_cdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As "___gmpz_cdiv_qr_ui"
  mpz_cdiv_ui.l(*n.mpz,d.l) As "___gmpz_cdiv_ui"
  mpz_cdiv_q_2exp(*q.mpz,*n.mpz,b.l) As "___gmpz_cdiv_q_2exp"
  mpz_cdiv_r_2exp(*r.mpz,*n.mpz,b.l) As "___gmpz_cdiv_r_2exp"
  mpz_fdiv_q(*q.mpz,*n.mpz,*d.mpz) As "___gmpz_fdiv_q"
  mpz_fdiv_r(*r.mpz,*n.mpz,*d.mpz) As "___gmpz_fdiv_r"
  mpz_fdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As "___gmpz_fdiv_qr"
  mpz_fdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As "___gmpz_fdiv_q_ui"
  mpz_fdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As "___gmpz_fdiv_r_ui"
  mpz_fdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As "___gmpz_fdiv_qr_ui"
  mpz_fdiv_ui.l(*n.mpz,d.l) As "___gmpz_fdiv_ui"
  mpz_fdiv_q_2exp(*q.mpz,*n.mpz,b.l) As "___gmpz_fdiv_q_2exp"
  mpz_fdiv_r_2exp(*r.mpz,*n.mpz,b.l) As "___gmpz_fdiv_r_2exp"
  mpz_tdiv_q(*q.mpz,*n.mpz,*d.mpz) As "___gmpz_tdiv_q"
  mpz_tdiv_r(*r.mpz,*n.mpz,*d.mpz) As "___gmpz_tdiv_r"
  mpz_tdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As "___gmpz_tdiv_qr"
  mpz_tdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As "___gmpz_tdiv_q_ui"
  mpz_tdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As "___gmpz_tdiv_r_ui"
  mpz_tdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As "___gmpz_tdiv_qr_ui"
  mpz_tdiv_ui.l(*n.mpz,d.l) As "___gmpz_tdiv_ui"
  mpz_tdiv_q_2exp(*q.mpz,*n.mpz,b.l) As "___gmpz_tdiv_q_2exp"
  mpz_tdiv_r_2exp(*r.mpz,*n.mpz,b.l) As "___gmpz_tdiv_r_2exp"
  mpz_mod(*r.mpz,*n.mpz,*d.mpz) As "___gmpz_mod"
  mpz_mod_ui.l(*r.mpz,*n.mpz,d.l) As "___gmpz_mod_ui"
  mpz_divexact(*q.mpz,*n.mpz,*d.mpz) As "___gmpz_divexact"
  mpz_divexact_ui(*q.mpz,*n.mpz,d.l) As "___gmpz_divexact_ui"
  mpz_divisible_p.l(*n.mpz,*d.mpz) As "___gmpz_divisible_p"
  mpz_divisible_ui_p.l(*n.mpz,d.l) As "___gmpz_divisible_ui_p"
  mpz_divisible_2exp_p.l(*n.mpz,b.l) As "___gmpz_divisible_2exp_p"
  mpz_congruent_p.l(*n.mpz,*c.mpz,*d.mpz) As "___gmpz_congruent_p"
  mpz_congruent_ui_p.l(*n.mpz,c.l,d.l) As "___gmpz_congruent_ui_p"
  mpz_congruent_2exp_p.l(*n.mpz,*c.mpz,b.l) As "___gmpz_congruent_2exp_p"
  mpz_powm(*rop.mpz,*base.mpz,*expt.mpz,*mod.mpz) As "___gmpz_powm"
  mpz_powm_ui(*rop.mpz,*base.mpz,expt.l,*mod.mpz) As "___gmpz_powm_ui"
  mpz_pow_ui(*rop.mpz,*base.mpz,expt.l) As "___gmpz_pow_ui"
  mpz_ui_pow_ui(*rop.mpz,base.l,expt.l) As "___gmpz_ui_pow_ui"
  mpz_root.l(*rop.mpz,*op.mpz,n.l) As "___gmpz_root"
  mpz_sqrt(*rop.mpz,*op.mpz) As "___gmpz_sqrt"
  mpz_sqrtrem(*rop1.mpz,*rop2.mpz,*op.mpz) As "___gmpz_sqrtrem"
  mpz_perfect_power_p.l(*op.mpz) As "___gmpz_perfect_power_p"
  mpz_perfect_square_p.l(*op.mpz) As "___gmpz_perfect_square_p"
  mpz_probab_prime_p.l(*n.mpz,reps.l) As "___gmpz_probab_prime_p"
  mpz_nextprime(*rop.mpz,*op.mpz) As "___gmpz_nextprime"
  mpz_gcd(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_gcd"
  mpz_gcd_ui.l(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_gcd_ui"
  mpz_gcdext(*g.mpz,*s.mpz,*t.mpz,*a.mpz,*b.mpz) As "___gmpz_gcdext"
  mpz_lcm(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_lcm"
  mpz_lcm_ui(*rop.mpz,*op1.mpz,op2.l) As "___gmpz_lcm_ui"
  mpz_invert.l(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_invert"
  mpz_jacobi.l(*a.mpz,*b.mpz) As "___gmpz_jacobi"
  mpz_legendre.l(*a.mpz,*p.mpz) As "___gmpz_legendre"
  mpz_kronecker.l(*a.mpz,*b.mpz) As "___gmpz_kronecker"
  mpz_kronecker_si.l(*a.mpz,b.l) As "___gmpz_kronecker_si"
  mpz_kronecker_ui.l(*a.mpz,b.l) As "___gmpz_kronecker_ui"
  mpz_si_kronecker.l(a.l,*b.mpz) As "___gmpz_si_kronecker"
  mpz_ui_kronecker.l(a.l,*b.mpz) As "___gmpz_ui_kronecker"
  mpz_remove.l(*rop.mpz,*op.mpz,*f.mpz) As "___gmpz_remove"
  mpz_fac_ui(*rop.mpz,op.l) As "___gmpz_fac_ui"
  mpz_bin_ui(*rop.mpz,*n.mpz,k.l) As "___gmpz_bin_ui"
  mpz_bin_uiui(*rop.mpz,n.l,k.l) As "___gmpz_bin_uiui"
  mpz_fib_ui(*fn.mpz,n.l) As "___gmpz_fib_ui"
  mpz_fib2_ui(*fn.mpz,*fnsub1.mpz,n.l) As "___gmpz_fib2_ui"
  mpz_lucnum_ui(*ln.mpz,n.l) As "___gmpz_lucnum_ui"
  mpz_lucnum2_ui(*ln.mpz,*lnsub1.mpz,n.l) As "___gmpz_lucnum2_ui"
  mpz_cmp.l(*op1.mpz,*op2.mpz) As "___gmpz_cmp"
  mpz_cmp_d.l(*op1.mpz,op2.d) As "___gmpz_cmp_d"
  mpz_cmp_si.l(*op1.mpz,op2.l) As "____gmpz_cmp_si"
  mpz_cmp_ui.l(*op1.mpz,op2.l) As "____gmpz_cmp_ui"
  mpz_cmpabs.l(*op1.mpz,*op2.mpz) As "___gmpz_cmpabs"
  mpz_cmpabs_d.l(*op1.mpz,op2.d) As "___gmpz_cmpabs_d"
  mpz_cmpabs_ui.l(*op1.mpz,op2.l) As "___gmpz_cmpabs_ui"
  mpz_sgn.l(*op.mpz) As "___gmpz_sgn"
  mpz_and(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_and"
  mpz_ior(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_ior"
  mpz_xor(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_xor"
  mpz_com(*rop.mpz,*op.mpz) As "___gmpz_com"
  mpz_popcount.l(*op.mpz) As "___gmpz_popcount"
  mpz_hamdist.l(*op1.mpz,*op2.mpz) As "___gmpz_hamdist"
  mpz_scan0.l(*op.mpz,starting_bit.l) As "___gmpz_scan0"
  mpz_scan1.l(*op.mpz,starting_bit.l) As "___gmpz_scan1"
  mpz_setbit(*rop.mpz,bit_index.l) As "___gmpz_setbit"
  mpz_clrbit(*rop.mpz,bit_index.l) As "___gmpz_clrbit"
  mpz_tstbit.l(*op.mpz,bit_index.l) As "___gmpz_tstbit"
  mpz_import(*rop.mpz,count.l,order.l,size.l,endian.l,nails.l,op.l) As "___gmpz_import"
  mpz_export.l(rop.l,countp.l,order.l,size.l,endian.l,nails.l,*op.mpz) As "___gmpz_export"
  mpz_fits_ulong_p.l(*op.mpz) As "___gmpz_fits_ulong_p"
  mpz_fits_slong_p.l(*op.mpz) As "___gmpz_fits_slong_p"
  mpz_fits_uint_p.l(*op.mpz) As "___gmpz_fits_uint_p"
  mpz_fits_sint_p.l(*op.mpz) As "___gmpz_fits_sint_p"
  mpz_fits_ushort_p.l(*op.mpz) As "___gmpz_fits_ushort_p"
  mpz_fits_sshort_p.l(*op.mpz) As "___gmpz_fits_sshort_p"
  mpz_odd_p.l(*op.mpz) As "___gmpz_odd_p"
  mpz_even_p.l(*op.mpz) As "___gmpz_even_p"
  mpz_size.l(*op.mpz) As "___gmpz_size"
  mpz_sizeinbase.l(*op.mpz,base.l) As "___gmpz_sizeinbase"
  mpq_init(*dest_rational.mpq) As "___gmpq_init"
  mpq_clear(*rational_number.mpq) As "___gmpq_clear"
  mpq_set(*rop.mpq,*op.mpq) As "___gmpq_set"
  mpq_set_z(*rop.mpq,*op.mpz) As "___gmpq_set_z"
  mpq_set_ui(*rop.mpq,op1.l,op2.l) As "___gmpq_set_ui"
  mpq_set_si(*rop.mpq,op1.l,op2.l) As "___gmpq_set_si"
  mpq_set_str.l(*rop.mpq,str.s,base.l) As "___gmpq_set_str"
  mpq_swap(*rop1.mpq,*rop2.mpq) As "___gmpq_swap"
  mpq_get_d.d(*op.mpq) As "___gmpq_get_d"
  mpq_set_d(*rop.mpq,op.d) As "___gmpq_set_d"
  mpq_set_f(*rop.mpq,*op.mpf) As "___gmpq_set_f"
  mpq_get_str.s(str.s,base.l,*op.mpq) As "___gmpq_get_str"
  mpq_add(*sum.mpq,*addend1.mpq,*addend2.mpq) As "___gmpq_add"
  mpq_sub(*difference.mpq,*minuend.mpq,*subtrahend.mpq) As "___gmpq_sub"
  mpq_mul(*product.mpq,*multiplier.mpq,*multiplicand.mpq) As "___gmpq_mul"
  mpq_mul_2exp(*rop.mpq,*op1.mpq,op2.l) As "___gmpq_mul_2exp"
  mpq_div(*quotient.mpq,*dividend.mpq,*divisor.mpq) As "___gmpq_div"
  mpq_div_2exp(*rop.mpq,*op1.mpq,op2.l) As "___gmpq_div_2exp"
  mpq_neg(*negated_operand.mpq,*operand.mpq) As "___gmpq_neg"
  mpq_abs(*rop.mpq,*op.mpq) As "___gmpq_abs"
  mpq_inv(*inverted_number.mpq,*number.mpq) As "___gmpq_inv"
  mpq_cmp.l(*op1.mpq,*op2.mpq) As "___gmpq_cmp"
  mpq_cmp_ui.l(*op1.mpq,num2.l,den2.l) As "____gmpq_cmp_ui"
  mpq_cmp_si.l(*op1.mpq,num2.l,den2.l) As "____gmpq_cmp_si"
  mpq_sgn.l(*op.mpq) As "___gmpq_sgn"
  mpq_equal.l(*op1.mpq,*op2.mpq) As "___gmpq_equal"
  mpq_get_num(*numerator.mpz,*rational.mpq) As "___gmpq_get_num"
  mpq_get_den(*denominator.mpz,*rational.mpq) As "___gmpq_get_den"
  mpq_set_num(*rational.mpq,*numerator.mpz) As "___gmpq_set_num"
  mpq_set_den(*rational.mpq,*denominator.mpz) As "___gmpq_set_den"
  mpq_canonicalize(*op.mpq) As "___gmpq_canonicalize"
EndImport

OpenConsole() 
ConsoleTitle ("GMP.DLL test") 

s.s

; integer ------------------------------------------------------------------------- 

i.mpz 
j.mpz 
k.mpz 

mpz_init(@i)            ;initialize multi-precision integer
mpz_init(@j)
mpz_init(@k)
mpz_set_str(@i,"2",10)  ;i = 2 base 10
mpz_set_str(@j,"7",10)
mpz_mul(@k,@i,@j)       ;k = i * j
s=Space(256)            ;allocate memory for string
gmp_sprintz(s,"%Zd",@k) ;sprint the value of k into string s
PrintN(s)
mpz_clear(@k)           ;de-allocate memory
mpz_clear(@j)
mpz_clear(@i)

; rational ------------------------------------------------------------------------ 

n.mpq 
m.mpq 
q.mpq 

mpq_init(@n)
mpq_init(@m)
mpq_init(@q)
mpq_set_str(@n,"4/12",10)
mpq_canonicalize(@n)
mpq_set_str(@m,"1/5",10)
mpq_add(@q,@n,@m)
s=Space(256)
gmp_sprintq(s,"%Qd",@q)
PrintN(s)
mpq_clear(@q)
mpq_clear(@m)
mpq_clear(@n)

; floating point ------------------------------------------------------------------ 

x.mpf 
y.mpf 
z.mpf 

mpf_init2(@x,256)
mpf_init2(@y,256)
mpf_init2(@z,256)
mpf_set_str(@x,"2",10)
mpf_sqrt(@y,@x)
s=Space(256)
gmp_sprintf(s,"%77.72Fe",@y)
PrintN(s)
mpf_pow_ui(@z,@y,2)
s=Space(256)
gmp_sprintf(s,"%77.72Fe",@z)
PrintN(s)
mpf_clear(@z)
mpf_clear(@y)
mpf_clear(@x)


Print("press the return key to end. ")
Input()
CloseConsole() 
End

Posted: Tue May 09, 2006 11:33 am
by Michael Vogel
Thanks, jack...

I've tested the routines, which are about 10 to 20 times faster than my brute force methode with strings (compared with the math term I had to solve)... :)

So, the only possibility to beat this routines would be to do write assembler routines for calculating with strings, maybe someone will try to do that?! :roll:

Re: "Exact" Calculations...

Posted: Thu Feb 04, 2016 6:32 pm
by Frarth
Line 50 of the above GMP example code gives me "String return type can't be used in Import/EndImport section." Obviously some things have changes since that code was posted. Can anyone tell me how to do this correctly using PB 5.41?

EDIT: It is this line here:

Code: Select all

 mpf_get_str.s(str.s,expptr.l,base.l,n_digits.l,*op.mpf) As "___gmpf_get_str"

Re: "Exact" Calculations...

Posted: Thu Feb 04, 2016 7:22 pm
by jack
try the following (for Windows)

Code: Select all

  Structure mpz ; multiprecision integer 
    mp_alloc.l 
    mp_size.l 
    mp_limb.i 
  EndStructure 
  
  Structure mpq ; multiprecision rational 
    mp_num.mpz 
    mp_den.mpz 
  EndStructure 
  
  Structure mpf ; multiprecision floating point 
    mp_prec.l 
    mp_size.l 
    mp_expt.i 
    mp_limb.i 
  EndStructure 
  
  Structure mpfr; multiprecision floating point
    prec.i
    sign.l
    exp.i
    d.i
  EndStructure


Structure gmp_randata_lc_t
   mp_a.i
   mp_c.i
   mp_m.i
   mp_m2exp.i
EndStructure

Structure mp_algdata_t
  StructureUnion
     *_mp_lc.gmp_randata_lc_t
   EndStructureUnion
EndStructure

Structure gmp_randstate_t
   mp_seed.mpz
   mp_alg.i
   mp_algdata.mp_algdata_t
EndStructure

#MPFR_RNDN   = 0 ;round to nearest
#MPFR_RNDZ   = 1 ;round towards zero
#MPFR_RNDU   = 2 ;round towards plus infinity
#MPFR_RNDD   = 3 ;round towards minus infinity
#MPFR_RNDA   = 4 ;round away from zero
#MPFR_RNDF   = 5 ;faithful rounding (not implemented yet)
#MPFR_RNDNA = -1 ;round to nearest, with ties away from zero (mpfr_round)

CompilerIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x64
  #USCRORE =""
CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows And #PB_Compiler_Processor = #PB_Processor_x86
  #USCRORE ="_"
CompilerEndIf

  ImportC "libgmp-10.lib"
    gmp_randinit_default (*state.gmp_randstate_t) As #USCRORE+"__gmp_randinit_default"
    gmp_randinit_lc_2exp (*state.gmp_randstate_t, *a.mpz, c.l, m2exp.l) As #USCRORE+"__gmp_randinit_lc_2exp"
    gmp_randinit_lc_2exp_size.l (*sate.gmp_randstate_t, size.l) As #USCRORE+"__gmp_randinit_lc_2exp_size"
    gmp_randseed (*state.gmp_randstate_t, *seed.mpz) As #USCRORE+"__gmp_randseed"
    gmp_randseed_ui (*state.gmp_randstate_t, seed.l) As #USCRORE+"__gmp_randseed_ui"
    gmp_randclear (*state.gmp_randstate_t) As #USCRORE+"__gmp_randclear"
    
    mpz_urandomb (*rop.mpz, *state.gmp_randstate_t, int.l) As #USCRORE+"__gmpz_urandomb"
  
    gmp_sprintz.l(dest.s,format.s,*n.mpz) As #USCRORE+"__gmp_sprintf"
    gmp_sprintq.l(dest.s,format.s,*n.mpq) As #USCRORE+"__gmp_sprintf"
    gmp_sprintf.l(dest.s,format.s,*n.mpf) As #USCRORE+"__gmp_sprintf"
    mpf_set_default_prec(prec.l) As #USCRORE+"__gmpf_set_default_prec"
    mpf_get_default_prec.l() As #USCRORE+"__gmpf_get_default_prec"
    mpf_init(*x.mpf) As #USCRORE+"__gmpf_init"
    mpf_init2(*x.mpf,prec.l) As #USCRORE+"__gmpf_init2"
    mpf_clear(*x.mpf) As #USCRORE+"__gmpf_clear"
    mpf_get_prec.l(*op.mpf) As #USCRORE+"__gmpf_get_prec"
    mpf_set_prec(*rop.mpf,prec.l) As #USCRORE+"__gmpf_set_prec"
    mpf_set_prec_raw(*rop.mpf,prec.l) As #USCRORE+"__gmpf_set_prec_raw"
    mpf_set(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_set"
    mpf_set_ui(*rop.mpf,op.l) As #USCRORE+"__gmpf_set_ui"
    mpf_set_si(*rop.mpf,op.l) As #USCRORE+"__gmpf_set_si"
    mpf_set_d(*rop.mpf,op.d) As #USCRORE+"__gmpf_set_d"
    mpf_set_z(*rop.mpf,*op.mpz) As #USCRORE+"__gmpf_set_z"
    mpf_set_q(*rop.mpf,*op.mpq) As #USCRORE+"__gmpf_set_q"
    mpf_set_str.l(*rop.mpf,str.s,base.l) As #USCRORE+"__gmpf_set_str"
    mpf_swap(*rop1.mpf,*rop2.mpf) As #USCRORE+"__gmpf_swap"
    mpf_init_set(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_init_set"
    mpf_init_set_ui(*rop.mpf,op.l) As #USCRORE+"__gmpf_init_set_ui"
    mpf_init_set_si(*rop.mpf,op.l) As #USCRORE+"__gmpf_init_set_si"
    mpf_init_set_d(*rop.mpf,op.d) As #USCRORE+"__gmpf_init_set_d"
    mpf_init_set_str.l(*rop.mpf,str.s,base.l) As #USCRORE+"__gmpf_init_set_str"
    mpf_get_d.d(*op.mpf) As #USCRORE+"__gmpf_get_d"
    mpf_get_d_2exp.d(expt.l,*op.mpf) As #USCRORE+"__gmpf_get_d_2exp"
    mpf_get_si.l(*op.mpf) As #USCRORE+"__gmpf_get_si"
    mpf_get_ui.l(*op.mpf) As #USCRORE+"__gmpf_get_ui"
    mpf_get_str(str.s,expptr.l,base.l,n_digits.l,*op.mpf) As #USCRORE+"__gmpf_get_str"
    mpf_ceil(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_ceil"
    mpf_floor(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_floor"
    mpf_trunc(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_trunc"
    mpf_integer_p.l(*op.mpf) As #USCRORE+"__gmpf_integer_p"
    mpf_fits_ulong_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_ulong_p"
    mpf_fits_slong_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_slong_p"
    mpf_fits_uint_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_uint_p"
    mpf_fits_sint_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_sint_p"
    mpf_fits_ushort_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_ushort_p"
    mpf_fits_sshort_p.l(*op.mpf) As #USCRORE+"__gmpf_fits_sshort_p"
    mpf_add(*rop.mpf,*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_add"
    mpf_add_ui(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_add_ui"
    mpf_sub(*rop.mpf,*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_sub"
    mpf_ui_sub(*rop.mpf,op1.l,*op2.mpf) As #USCRORE+"__gmpf_ui_sub"
    mpf_sub_ui(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_sub_ui"
    mpf_mul(*rop.mpf,*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_mul"
    mpf_mul_ui(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_mul_ui"
    mpf_div(*rop.mpf,*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_div"
    mpf_ui_div(*rop.mpf,op1.l,*op2.mpf) As #USCRORE+"__gmpf_ui_div"
    mpf_div_ui(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_div_ui"
    mpf_sqrt(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_sqrt"
    mpf_sqrt_ui(*rop.mpf,op.l) As #USCRORE+"__gmpf_sqrt_ui"
    mpf_pow_ui(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_pow_ui"
    mpf_neg(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_neg"
    mpf_abs(*rop.mpf,*op.mpf) As #USCRORE+"__gmpf_abs"
    mpf_mul_2exp(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_mul_2exp"
    mpf_div_2exp(*rop.mpf,*op1.mpf,op2.l) As #USCRORE+"__gmpf_div_2exp"
    mpf_cmp.l(*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_cmp"
    mpf_cmp_d.l(*op1.mpf,op2.d) As #USCRORE+"__gmpf_cmp_d"
    mpf_cmp_ui.l(*op1.mpf,op2.l) As #USCRORE+"__gmpf_cmp_ui"
    mpf_cmp_si.l(*op1.mpf,op2.l) As #USCRORE+"__gmpf_cmp_si"
    mpf_eq.l(*op1.mpf,*op2.mpf,op3.l) As #USCRORE+"__gmpf_eq"
    mpf_reldiff(*rop.mpf,*op1.mpf,*op2.mpf) As #USCRORE+"__gmpf_reldiff"
    mpf_sgn.l(*op.mpf) As #USCRORE+"__gmpf_sgn"
    gmp_snprintf.l(buf.s,Size.l,fmt.s,*op.mpf) As #USCRORE+"__gmp_snprintf"
    mpz_init(*integer.mpz) As #USCRORE+"__gmpz_init"
    mpz_init2(*integer.mpz,n.l) As #USCRORE+"__gmpz_init2"
    mpz_clear(*integer.mpz) As #USCRORE+"__gmpz_clear"
    mpz_realloc2(*integer.mpz,n.l) As #USCRORE+"__gmpz_realloc2"
  ;  mpz_realloc.l(*integer.mpz,) As #USCRORE+"___gmpz_realloc"
    mpz_set(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_set"
    mpz_set_ui(*rop.mpz,op.l) As #USCRORE+"__gmpz_set_ui"
    mpz_set_si(*rop.mpz,op.l) As #USCRORE+"__gmpz_set_si"
    mpz_set_d(*rop.mpz,op.d) As #USCRORE+"__gmpz_set_d"
    mpz_set_q(*rop.mpz,*op.mpq) As #USCRORE+"__gmpz_set_q"
    mpz_set_f(*rop.mpz,*op.mpf) As #USCRORE+"__gmpz_set_f"
    mpz_set_str.l(*rop.mpz,str.s,base.l) As #USCRORE+"__gmpz_set_str"
    mpz_swap(*rop1.mpz,*rop2.mpz) As #USCRORE+"__gmpz_swap"
    mpz_init_set(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_init_set"
    mpz_init_set_ui(*rop.mpz,op.l) As #USCRORE+"__gmpz_init_set_ui"
    mpz_init_set_si(*rop.mpz,op.l) As #USCRORE+"__gmpz_init_set_si"
    mpz_init_set_d(*rop.mpz,op.d) As #USCRORE+"__gmpz_init_set_d"
    mpz_init_set_str.l(*rop.mpz,str.s,base.l) As #USCRORE+"__gmpz_init_set_str"
    mpz_add(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_add"
    mpz_add_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_add_ui"
    mpz_sub(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_sub"
    mpz_sub_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_sub_ui"
    mpz_ui_sub(*rop.mpz,op1.l,*op2.mpz) As #USCRORE+"__gmpz_ui_sub"
    mpz_mul(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_mul"
    mpz_mul_si(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_mul_si"
    mpz_mul_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_mul_ui"
    mpz_addmul(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_addmul"
    mpz_addmul_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_addmul_ui"
    mpz_submul(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_submul"
    mpz_submul_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_submul_ui"
    mpz_mul_2exp(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_mul_2exp"
    mpz_neg(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_neg"
    mpz_abs(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_abs"
    mpz_cdiv_q(*q.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_cdiv_q"
    mpz_cdiv_r(*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_cdiv_r"
    mpz_cdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_cdiv_qr"
    mpz_cdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_cdiv_q_ui"
    mpz_cdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_cdiv_r_ui"
    mpz_cdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_cdiv_qr_ui"
    mpz_cdiv_ui.l(*n.mpz,d.l) As #USCRORE+"__gmpz_cdiv_ui"
    mpz_cdiv_q_2exp(*q.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_cdiv_q_2exp"
    mpz_cdiv_r_2exp(*r.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_cdiv_r_2exp"
    mpz_fdiv_q(*q.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_fdiv_q"
    mpz_fdiv_r(*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_fdiv_r"
    mpz_fdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_fdiv_qr"
    mpz_fdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_fdiv_q_ui"
    mpz_fdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_fdiv_r_ui"
    mpz_fdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_fdiv_qr_ui"
    mpz_fdiv_ui.l(*n.mpz,d.l) As #USCRORE+"__gmpz_fdiv_ui"
    mpz_fdiv_q_2exp(*q.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_fdiv_q_2exp"
    mpz_fdiv_r_2exp(*r.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_fdiv_r_2exp"
    mpz_tdiv_q(*q.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_tdiv_q"
    mpz_tdiv_r(*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_tdiv_r"
    mpz_tdiv_qr(*q.mpz,*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_tdiv_qr"
    mpz_tdiv_q_ui.l(*q.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_tdiv_q_ui"
    mpz_tdiv_r_ui.l(*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_tdiv_r_ui"
    mpz_tdiv_qr_ui.l(*q.mpz,*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_tdiv_qr_ui"
    mpz_tdiv_ui.l(*n.mpz,d.l) As #USCRORE+"__gmpz_tdiv_ui"
    mpz_tdiv_q_2exp(*q.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_tdiv_q_2exp"
    mpz_tdiv_r_2exp(*r.mpz,*n.mpz,b.l) As #USCRORE+"__gmpz_tdiv_r_2exp"
    mpz_mod(*r.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_mod"
    mpz_mod_ui.l(*r.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_mod_ui"
    mpz_divexact(*q.mpz,*n.mpz,*d.mpz) As #USCRORE+"__gmpz_divexact"
    mpz_divexact_ui(*q.mpz,*n.mpz,d.l) As #USCRORE+"__gmpz_divexact_ui"
    mpz_divisible_p.l(*n.mpz,*d.mpz) As #USCRORE+"__gmpz_divisible_p"
    mpz_divisible_ui_p.l(*n.mpz,d.l) As #USCRORE+"__gmpz_divisible_ui_p"
    mpz_divisible_2exp_p.l(*n.mpz,b.l) As #USCRORE+"__gmpz_divisible_2exp_p"
    mpz_congruent_p.l(*n.mpz,*c.mpz,*d.mpz) As #USCRORE+"__gmpz_congruent_p"
    mpz_congruent_ui_p.l(*n.mpz,c.l,d.l) As #USCRORE+"__gmpz_congruent_ui_p"
    mpz_congruent_2exp_p.l(*n.mpz,*c.mpz,b.l) As #USCRORE+"__gmpz_congruent_2exp_p"
    mpz_powm(*rop.mpz,*base.mpz,*expt.mpz,*mod.mpz) As #USCRORE+"__gmpz_powm"
    mpz_powm_ui(*rop.mpz,*base.mpz,expt.l,*mod.mpz) As #USCRORE+"__gmpz_powm_ui"
    mpz_pow_ui(*rop.mpz,*base.mpz,expt.l) As #USCRORE+"__gmpz_pow_ui"
    mpz_ui_pow_ui(*rop.mpz,base.l,expt.l) As #USCRORE+"__gmpz_ui_pow_ui"
    mpz_root.l(*rop.mpz,*op.mpz,n.l) As #USCRORE+"__gmpz_root"
    mpz_sqrt(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_sqrt"
    mpz_sqrtrem(*rop1.mpz,*rop2.mpz,*op.mpz) As #USCRORE+"__gmpz_sqrtrem"
    mpz_perfect_power_p.l(*op.mpz) As #USCRORE+"__gmpz_perfect_power_p"
    mpz_perfect_square_p.l(*op.mpz) As #USCRORE+"__gmpz_perfect_square_p"
    mpz_probab_prime_p.l(*n.mpz,reps.l) As #USCRORE+"__gmpz_probab_prime_p"
    mpz_nextprime(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_nextprime"
    mpz_gcd(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_gcd"
    mpz_gcd_ui.l(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_gcd_ui"
    mpz_gcdext(*g.mpz,*s.mpz,*t.mpz,*a.mpz,*b.mpz) As #USCRORE+"__gmpz_gcdext"
    mpz_lcm(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_lcm"
    mpz_lcm_ui(*rop.mpz,*op1.mpz,op2.l) As #USCRORE+"__gmpz_lcm_ui"
    mpz_invert.l(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_invert"
    mpz_jacobi.l(*a.mpz,*b.mpz) As #USCRORE+"__gmpz_jacobi"
    mpz_legendre.l(*a.mpz,*p.mpz) As #USCRORE+"__gmpz_legendre"
    mpz_kronecker.l(*a.mpz,*b.mpz) As #USCRORE+"__gmpz_kronecker"
    mpz_kronecker_si.l(*a.mpz,b.l) As #USCRORE+"__gmpz_kronecker_si"
    mpz_kronecker_ui.l(*a.mpz,b.l) As #USCRORE+"__gmpz_kronecker_ui"
    mpz_si_kronecker.l(a.l,*b.mpz) As #USCRORE+"__gmpz_si_kronecker"
    mpz_ui_kronecker.l(a.l,*b.mpz) As #USCRORE+"__gmpz_ui_kronecker"
    mpz_remove.l(*rop.mpz,*op.mpz,*f.mpz) As #USCRORE+"__gmpz_remove"
    mpz_fac_ui(*rop.mpz,op.l) As #USCRORE+"__gmpz_fac_ui"
    mpz_bin_ui(*rop.mpz,*n.mpz,k.l) As #USCRORE+"__gmpz_bin_ui"
    mpz_bin_uiui(*rop.mpz,n.l,k.l) As #USCRORE+"__gmpz_bin_uiui"
    mpz_fib_ui(*fn.mpz,n.l) As #USCRORE+"__gmpz_fib_ui"
    mpz_fib2_ui(*fn.mpz,*fnsub1.mpz,n.l) As #USCRORE+"__gmpz_fib2_ui"
    mpz_lucnum_ui(*ln.mpz,n.l) As #USCRORE+"__gmpz_lucnum_ui"
    mpz_lucnum2_ui(*ln.mpz,*lnsub1.mpz,n.l) As #USCRORE+"__gmpz_lucnum2_ui"
    mpz_cmp.l(*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_cmp"
    mpz_cmp_d.l(*op1.mpz,op2.d) As #USCRORE+"__gmpz_cmp_d"
    mpz_cmp_si.l(*op1.mpz,op2.l) As #USCRORE+"___gmpz_cmp_si"
    mpz_cmp_ui.l(*op1.mpz,op2.l) As #USCRORE+"___gmpz_cmp_ui"
    mpz_cmpabs.l(*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_cmpabs"
    mpz_cmpabs_d.l(*op1.mpz,op2.d) As #USCRORE+"__gmpz_cmpabs_d"
    mpz_cmpabs_ui.l(*op1.mpz,op2.l) As #USCRORE+"__gmpz_cmpabs_ui"
    mpz_sgn.l(*op.mpz) As #USCRORE+"__gmpz_sgn"
    mpz_and(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_and"
    mpz_ior(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_ior"
    mpz_xor(*rop.mpz,*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_xor"
    mpz_com(*rop.mpz,*op.mpz) As #USCRORE+"__gmpz_com"
    mpz_popcount.l(*op.mpz) As #USCRORE+"__gmpz_popcount"
    mpz_hamdist.l(*op1.mpz,*op2.mpz) As #USCRORE+"__gmpz_hamdist"
    mpz_scan0.l(*op.mpz,starting_bit.l) As #USCRORE+"__gmpz_scan0"
    mpz_scan1.l(*op.mpz,starting_bit.l) As #USCRORE+"__gmpz_scan1"
    mpz_setbit(*rop.mpz,bit_index.l) As #USCRORE+"__gmpz_setbit"
    mpz_clrbit(*rop.mpz,bit_index.l) As #USCRORE+"__gmpz_clrbit"
    mpz_tstbit.l(*op.mpz,bit_index.l) As #USCRORE+"__gmpz_tstbit"
    mpz_import(*rop.mpz,count.l,order.l,Size.l,endian.l,nails.l,op.l) As #USCRORE+"__gmpz_import"
    mpz_export.l(rop.l,countp.l,order.l,Size.l,endian.l,nails.l,*op.mpz) As #USCRORE+"__gmpz_export"
    mpz_fits_ulong_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_ulong_p"
    mpz_fits_slong_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_slong_p"
    mpz_fits_uint_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_uint_p"
    mpz_fits_sint_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_sint_p"
    mpz_fits_ushort_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_ushort_p"
    mpz_fits_sshort_p.l(*op.mpz) As #USCRORE+"__gmpz_fits_sshort_p"
    mpz_odd_p.l(*op.mpz) As #USCRORE+"__gmpz_odd_p"
    mpz_even_p.l(*op.mpz) As #USCRORE+"__gmpz_even_p"
    mpz_size.l(*op.mpz) As #USCRORE+"__gmpz_size"
    mpz_sizeinbase.l(*op.mpz,base.l) As #USCRORE+"__gmpz_sizeinbase"
    mpq_init(*dest_rational.mpq) As #USCRORE+"__gmpq_init"
    mpq_clear(*rational_number.mpq) As #USCRORE+"__gmpq_clear"
    mpq_set(*rop.mpq,*op.mpq) As #USCRORE+"__gmpq_set"
    mpq_set_z(*rop.mpq,*op.mpz) As #USCRORE+"__gmpq_set_z"
    mpq_set_ui(*rop.mpq,op1.l,op2.l) As #USCRORE+"__gmpq_set_ui"
    mpq_set_si(*rop.mpq,op1.l,op2.l) As #USCRORE+"__gmpq_set_si"
    mpq_set_str.l(*rop.mpq,str.s,base.l) As #USCRORE+"__gmpq_set_str"
    mpq_swap(*rop1.mpq,*rop2.mpq) As #USCRORE+"__gmpq_swap"
    mpq_get_d.d(*op.mpq) As #USCRORE+"__gmpq_get_d"
    mpq_set_d(*rop.mpq,op.d) As #USCRORE+"__gmpq_set_d"
    mpq_set_f(*rop.mpq,*op.mpf) As #USCRORE+"__gmpq_set_f"
    mpq_get_str(str.s,base.l,*op.mpq) As #USCRORE+"__gmpq_get_str"
    mpq_add(*sum.mpq,*addend1.mpq,*addend2.mpq) As #USCRORE+"__gmpq_add"
    mpq_sub(*difference.mpq,*minuend.mpq,*subtrahend.mpq) As #USCRORE+"__gmpq_sub"
    mpq_mul(*product.mpq,*multiplier.mpq,*multiplicand.mpq) As #USCRORE+"__gmpq_mul"
    mpq_mul_2exp(*rop.mpq,*op1.mpq,op2.l) As #USCRORE+"__gmpq_mul_2exp"
    mpq_div(*quotient.mpq,*dividend.mpq,*divisor.mpq) As #USCRORE+"__gmpq_div"
    mpq_div_2exp(*rop.mpq,*op1.mpq,op2.l) As #USCRORE+"__gmpq_div_2exp"
    mpq_neg(*negated_operand.mpq,*operand.mpq) As #USCRORE+"__gmpq_neg"
    mpq_abs(*rop.mpq,*op.mpq) As #USCRORE+"__gmpq_abs"
    mpq_inv(*inverted_number.mpq,*number.mpq) As #USCRORE+"__gmpq_inv"
    mpq_cmp.l(*op1.mpq,*op2.mpq) As #USCRORE+"__gmpq_cmp"
    mpq_cmp_ui.l(*op1.mpq,num2.l,den2.l) As #USCRORE+"___gmpq_cmp_ui"
    mpq_cmp_si.l(*op1.mpq,num2.l,den2.l) As #USCRORE+"___gmpq_cmp_si"
    mpq_sgn.l(*op.mpq) As #USCRORE+"__gmpq_sgn"
    mpq_equal.l(*op1.mpq,*op2.mpq) As #USCRORE+"__gmpq_equal"
    mpq_get_num(*numerator.mpz,*rational.mpq) As #USCRORE+"__gmpq_get_num"
    mpq_get_den(*denominator.mpz,*rational.mpq) As #USCRORE+"__gmpq_get_den"
    mpq_set_num(*rational.mpq,*numerator.mpz) As #USCRORE+"__gmpq_set_num"
    mpq_set_den(*rational.mpq,*denominator.mpz) As #USCRORE+"__gmpq_set_den"
    mpq_canonicalize(*op.mpq) As #USCRORE+"__gmpq_canonicalize"
  EndImport
  
  ImportC "libmpfr-4.lib"
    mpfr_get_patches.i() As #USCRORE+"mpfr_get_patches"
    mpfr_buildopt_tls_p.l() As #USCRORE+"mpfr_buildopt_tls_p"
    mpfr_buildopt_decimal_p.l() As #USCRORE+"mpfr_buildopt_decimal_p"
    mpfr_buildopt_gmpinternals_p.l() As #USCRORE+"mpfr_buildopt_gmpinternals_p"
    mpfr_buildopt_tune_case.i() As #USCRORE+"mpfr_buildopt_tune_case"
    mpfr_set_emin.l(b.l) As #USCRORE+"mpfr_set_emin"
    mpfr_set_emax.l(b.l) As #USCRORE+"mpfr_set_emax"
    mpfr_set_default_rounding_mode(b.l) As #USCRORE+"mpfr_set_default_rounding_mode"
    mpfr_print_rnd_mode.i(b.l) As #USCRORE+"mpfr_print_rnd_mode"  ;As string pointer
    mpfr_clear_flags() As #USCRORE+"mpfr_clear_flags"
    mpfr_clear_underflow() As #USCRORE+"mpfr_clear_underflow"
    mpfr_clear_overflow() As #USCRORE+"mpfr_clear_overflow"
    mpfr_clear_divby0() As #USCRORE+"mpfr_clear_divby0"
    mpfr_clear_nanflag() As #USCRORE+"mpfr_clear_nanflag"
    mpfr_clear_inexflag() As #USCRORE+"mpfr_clear_inexflag"
    mpfr_clear_erangeflag() As #USCRORE+"mpfr_clear_erangeflag"
    mpfr_set_underflow() As #USCRORE+"mpfr_set_underflow"
    mpfr_set_overflow() As #USCRORE+"mpfr_set_overflow"
    mpfr_set_divby0() As #USCRORE+"mpfr_set_divby0"
    mpfr_set_nanflag() As #USCRORE+"mpfr_set_nanflag"
    mpfr_set_inexflag() As #USCRORE+"mpfr_set_inexflag"
    mpfr_set_erangeflag() As #USCRORE+"mpfr_set_erangeflag"
    mpfr_underflow_p.l() As #USCRORE+"mpfr_underflow_p"
    mpfr_overflow_p.l() As #USCRORE+"mpfr_overflow_p"
    mpfr_divby0_p.l() As #USCRORE+"mpfr_divby0_p"
    mpfr_nanflag_p.l() As #USCRORE+"mpfr_nanflag_p"
    mpfr_inexflag_p.l() As #USCRORE+"mpfr_inexflag_p"
    mpfr_erangeflag_p.l() As #USCRORE+"mpfr_erangeflag_p"
    mpfr_check_range.l(*x.mpfr, n.l, round.l) As #USCRORE+"mpfr_check_range"
    
    mpfr_init2(*x.mpfr,prec.l) As #USCRORE+"mpfr_init2"
    mpfr_init(*x.mpfr) As #USCRORE+"mpfr_init"
    mpfr_clear(*x.mpfr) As #USCRORE+"mpfr_clear"
    
    ;mpfr_inits2(prec.l, *x.mpfr, ...) As #USCRORE+"mpfr_inits2"
    ;mpfr_inits(*x.mpfr, ...) As #USCRORE+"mpfr_inits"
    ;
    ;initialize variable length list of variables, the end of list is indicated by 0
    ;don't see how you can do it in PureBasic.
    
    ;mpfr_clears(*x.mpfr, ...) As #USCRORE+"mpfr_clears"
    ;same here, except it clears a list of variables
    
    mpfr_set_default_prec(prec.l) As #USCRORE+"mpfr_set_default_prec"
    mpfr_get_default_prec.l() As #USCRORE+"mpfr_get_default_prec"
    mpfr_set_prec(*x.mpfr,prec.l) As #USCRORE+"mpfr_set_prec"
    mpfr_get_prec.l(*x.mpfr) As #USCRORE+"mpfr_get_prec"
    mpfr_set.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_set"
    mpfr_set_ui.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_set_ui"
    mpfr_set_si.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_set_si"
    mpfr_set_d.l(*rop.mpfr,op.d,round.l) As #USCRORE+"mpfr_set_d"
    mpfr_set_ld.l(*rop.mpfr,op.d,round.l) As #USCRORE+"mpfr_set_ld"
    mpfr_set_z.l(*rop.mpfr,*op.mpz,round.l) As #USCRORE+"mpfr_set_z"
    mpfr_set_q.l(*rop.mpfr,*op.mpq,round.l) As #USCRORE+"mpfr_set_q"
    mpfr_set_f.l(*rop.mpfr,*op.mpf,round.l) As #USCRORE+"mpfr_set_f"
    mpfr_set_ui_2exp.l(*rop.mpfr,op.l,e.l,round.l) As #USCRORE+"mpfr_set_ui_2exp"
    mpfr_set_si_2exp.l(*rop.mpfr,op.l,e.l,round.l) As #USCRORE+"mpfr_set_si_2exp"
    mpfr_set_str.l(*rop.mpfr,s.s,base.l,round.l) As #USCRORE+"mpfr_set_str"
    mpfr_set_inf(*x.mpfr,sign.l) As #USCRORE+"mpfr_set_inf"
    mpfr_set_nan(*x.mpfr) As #USCRORE+"mpfr_set_nan"
    mpfr_swap(*x.mpfr,*y.mpfr) As #USCRORE+"mpfr_swap"
    mpfr_init_set.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_init_set"
    mpfr_init_set_ui.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_init_set_ui"
    mpfr_init_set_si.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_init_set_si"
    mpfr_init_set_d.l(*rop.mpfr,op.d,round.l) As #USCRORE+"mpfr_init_set_d"
    mpfr_init_set_z.l(*rop.mpfr,*op.mpz,round.l) As #USCRORE+"mpfr_init_set_z"
    mpfr_init_set_q.l(*rop.mpfr,*op.mpq,round.l) As #USCRORE+"mpfr_init_set_q"
    mpfr_init_set_f.l(*rop.mpfr,*op.mpf,round.l) As #USCRORE+"mpfr_init_set_f"
    mpfr_get_d.d(*op.mpfr,round.l) As #USCRORE+"mpfr_get_d"
    mpfr_get_ld.d(*op.mpfr,round.l) As #USCRORE+"mpfr_get_ld"
    mpfr_get_d_2exp.d(expt.l,*op.mpfr,round.l) As #USCRORE+"mpfr_get_d_2exp"
    mpfr_get_si.l(*op.mpfr,round.l) As #USCRORE+"mpfr_get_si"
    mpfr_get_ui.l(*op.mpfr,round.l) As #USCRORE+"mpfr_get_ui"
    mpfr_get_z_exp.l(*rop.mpz,*op.mpfr) As #USCRORE+"mpfr_get_z_2exp"
    mpfr_get_z(*rop.mpz,*op.mpfr,round.l) As #USCRORE+"mpfr_get_z"
    mpfr_get_str(str.s,expptr.l,base.l,n.l,*op.mpfr,round.l) As #USCRORE+"mpfr_get_str"
    mpfr_free_str(str.s) As #USCRORE+"mpfr_free_str"
    mpfr_add.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_add"
    mpfr_add_ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_add_ui"
    mpfr_add_si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_add_si"
    mpfr_add_z.l(*rop.mpfr,*op1.mpfr,*op2.mpz,round.l) As #USCRORE+"mpfr_add_z"
    mpfr_add_q.l(*rop.mpfr,*op1.mpfr,*op2.mpq,round.l) As #USCRORE+"mpfr_add_q"
    mpfr_sub.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_sub"
    mpfr_ui_sub.l(*rop.mpfr,op1.l,*op2.mpfr,round.l) As #USCRORE+"mpfr_ui_sub"
    mpfr_sub_ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_sub_ui"
    mpfr_si_sub.l(*rop.mpfr,op1.l,*op2.mpfr,round.l) As #USCRORE+"mpfr_si_sub"
    mpfr_sub_si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_sub_si"
    mpfr_sub_z.l(*rop.mpfr,*op1.mpfr,*op2.mpz,round.l) As #USCRORE+"mpfr_sub_z"
    mpfr_sub_q.l(*rop.mpfr,*op1.mpfr,*op2.mpq,round.l) As #USCRORE+"mpfr_sub_q"
    mpfr_mul.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_mul"
    mpfr_mul_ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_mul_ui"
    mpfr_mul_si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_mul_si"
    mpfr_mul_z.l(*rop.mpfr,*op1.mpfr,*op2.mpz,round.l) As #USCRORE+"mpfr_mul_z"
    mpfr_mul_q.l(*rop.mpfr,*op1.mpfr,*op2.mpq,round.l) As #USCRORE+"mpfr_mul_q"
    mpfr_sqr.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_sqr"
    
    mpfr_const_pi.l(*rop.mpfr, round.l) As #USCRORE+"mpfr_const_pi"
    mpfr_const_log2.l(*rop.mpfr, round.l) As #USCRORE+"mpfr_const_log2"
    mpfr_const_euler.l(*rop.mpfr, round.l) As #USCRORE+"mpfr_const_euler"
    mpfr_const_catalan.l(*rop.mpfr, round.l) As #USCRORE+"mpfr_const_catalan"
    
    mpfr_div.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_div"
    mpfr_ui_div.l(*rop.mpfr,op1.l,*op2.mpfr,round.l) As #USCRORE+"mpfr_ui_div"
    mpfr_div_ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_div_ui"
    mpfr_si_div.l(*rop.mpfr,op1.l,*op2.mpfr,round.l) As #USCRORE+"mpfr_si_div"
    mpfr_div_si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_div_si"
    mpfr_div_z.l(*rop.mpfr,*op1.mpfr,*op2.mpz,round.l) As #USCRORE+"mpfr_div_z"
    mpfr_div_q.l(*rop.mpfr,*op1.mpfr,*op2.mpq,round.l) As #USCRORE+"mpfr_div_q"
    mpfr_sqrt.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_sqrt"
    mpfr_sqrt_ui.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_sqrt_ui"
    mpfr_cbrt.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_cbrt"
    mpfr_pow.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_pow"
    mpfr_pow_ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_pow_ui"
    mpfr_pow_si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_pow_si"
    mpfr_ui_pow_ui.l(*rop.mpfr,op1.l,op2.l,round.l) As #USCRORE+"mpfr_ui_pow_ui"
    mpfr_ui_pow.l(*rop.mpfr,op1.l,*op2.mpfr,round.l) As #USCRORE+"mpfr_ui_pow"
    mpfr_neg.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_neg"
    mpfr_abs.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_abs"
    mpfr_mul_2ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_mul_2ui"
    mpfr_mul_2si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_mul_2si"
    mpfr_div_2ui.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_div_2ui"
    mpfr_div_2si.l(*rop.mpfr,*op1.mpfr,op2.l,round.l) As #USCRORE+"mpfr_div_2si"
    mpfr_cmp.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_cmp"
    mpfr_cmp_ui.l(*op1.mpfr,op2.l) As #USCRORE+"mpfr_cmp_ui"
    mpfr_cmp_si.l(*op1.mpfr,op2.l) As #USCRORE+"mpfr_cmp_si"
    mpfr_cmp_d.l(*op1.mpfr,op2.d) As #USCRORE+"mpfr_cmp_d"
    mpfr_cmp_ld.l(*op1.mpfr,op2.d) As #USCRORE+"mpfr_cmp_ld"
    mpfr_cmp_z.l(*op1.mpfr,*op2.mpz) As #USCRORE+"mpfr_cmp_z"
    mpfr_cmp_q.l(*op1.mpfr,*op2.mpq) As #USCRORE+"mpfr_cmp_q"
    mpfr_cmp_f.l(*op1.mpfr,*op2.mpf) As #USCRORE+"mpfr_cmp_f"
    mpfr_cmp_ui_2exp.l(*op1.mpfr,op2.l,e.l) As #USCRORE+"mpfr_cmp_ui_2exp"
    mpfr_cmp_si_2exp.l(*op1.mpfr,op2.l,e.l) As #USCRORE+"mpfr_cmp_si_2exp"
    mpfr_cmpabs.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_cmpabs"
    mpfr_nan_p.l(*op.mpfr) As #USCRORE+"mpfr_nan_p"
    mpfr_inf_p.l(*op.mpfr) As #USCRORE+"mpfr_inf_p"
    mpfr_number_p.l(*op.mpfr) As #USCRORE+"mpfr_number_p"
    mpfr_zero_p.l(*op.mpfr) As #USCRORE+"mpfr_zero_p"
    mpfr_sgn.l(*op.mpfr) As #USCRORE+"mpfr_sgn"
    mpfr_greater_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_greater_p"
    mpfr_greaterequal_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_greaterequal_p"
    mpfr_less_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_less_p"
    mpfr_lessequal_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_lessequal_p"
    mpfr_lessgreater_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_lessgreater_p"
    mpfr_equal_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_equal_p"
    mpfr_unordered_p.l(*op1.mpfr,*op2.mpfr) As #USCRORE+"mpfr_unordered_p"
    mpfr_log.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_log"
    mpfr_log2.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_log2"
    mpfr_log10.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_log10"
    mpfr_exp.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_exp"
    mpfr_exp2.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_exp2"
    mpfr_exp10.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_exp10"
    mpfr_cos.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_cos"
    mpfr_sin.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_sin"
    mpfr_tan.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_tan"
    mpfr_sin_cos.l(*sop.mpfr,*cop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_sin_cos"
    mpfr_acos.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_acos"
    mpfr_asin.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_asin"
    mpfr_atan.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_atan"
    mpfr_cosh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_cosh"
    mpfr_sinh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_sinh"
    mpfr_tanh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_tanh"
    mpfr_acosh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_acosh"
    mpfr_asinh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_asinh"
    mpfr_atanh.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_atanh"
    mpfr_fac_ui.l(*rop.mpfr,op.l,round.l) As #USCRORE+"mpfr_fac_ui"
    mpfr_log1p.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_log1p"
    mpfr_expm1.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_expm1"
    mpfr_gamma.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_gamma"
    mpfr_lngamma.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_lngamma"
    mpfr_zeta.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_zeta"
    mpfr_erf.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_erf"
    mpfr_fma.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,*op3.mpfr,round.l) As #USCRORE+"mpfr_fma"
    mpfr_agm.l(*rop.mpfr,*op1.mpfr,*op2.mpfr,round.l) As #USCRORE+"mpfr_agm"
  
    mpfr_free_cache() As #USCRORE+"mpfr_free_cache"
    mpfr_rint.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_rint"
    mpfr_ceil.l(*rop.mpfr,*op.mpfr) As #USCRORE+"mpfr_ceil"
    mpfr_floor.l(*rop.mpfr,*op.mpfr) As #USCRORE+"mpfr_floor"
    mpfr_round.l(*rop.mpfr,*op.mpfr) As #USCRORE+"mpfr_round"
    mpfr_trunc.l(*rop.mpfr,*op.mpfr) As #USCRORE+"mpfr_trunc"
    mpfr_rint_ceil.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_rint_ceil"
    mpfr_rint_floor.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_rint_floor"
    mpfr_rint_round.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_rint_round"
    mpfr_rint_trunc.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_rint_trunc"
    mpfr_frac.l(*rop.mpfr,*op.mpfr,round.l) As #USCRORE+"mpfr_frac"
    mpfr_integer_p.l(*op.mpfr) As #USCRORE+"mpfr_integer_p"
    mpfr_printf (format.s, round.l, *rop.mpfr)
    mpfr_sprintf (dest.s, format.s, round.l, *rop.mpfr)
    mpfr_sprintfp (*dest, format.s, round.l, *rop.mpfr) As #USCRORE+"mpfr_sprintf"
  EndImport

Procedure mpfr_to_mpf(*z.mpfr,*x.mpf,*k.mpz)
   xp.l
   xp=mpfr_get_z_exp(*k, *z)
   mpf_set_z(*x, *k)
   If (xp<0)
      xp=Abs(xp)
      mpf_div_2exp(*x,*x,xp)
   Else
      mpf_mul_2exp(*x,*x,xp)
   EndIf
   ProcedureReturn
EndProcedure


OpenConsole() 
ConsoleTitle ("GMP.DLL test") 

s.s

PrintN(" integer -----------------------------------------------------------------------") 

i.mpz 
j.mpz 
k.mpz 

mpz_init(i)
mpz_init(j)
mpz_init(k)
mpz_set_str(i,"3",10)
mpz_set_str(j,"5",10)
mpz_mul(k,i,j)
s=Space(256)
gmp_sprintz(s,"%Zd",k)
PrintN(" 3 * 5 = "+s)
mpz_clear(k)
mpz_clear(j)
mpz_clear(i)
PrintN("")

PrintN(" rational ----------------------------------------------------------------------") 

n.mpq 
m.mpq 
q.mpq 

mpq_init(n)
mpq_init(m)
mpq_init(q)
mpq_set_str(n,"4/12",10) ; to illustrate how to reduce fraction to least common denominator
mpq_canonicalize(n)  ;---> reduce 4/12 to 1/3, fraction need to in reduced form when
                         ; performing arithmetic operatins.
mpq_set_str(m,"1/5",10)
mpq_add(q,n,m)
s=Space(256)
gmp_sprintq(s,"%Qd",q)
PrintN(" 1/3 + 1/5 = "+s)
mpq_clear(q)
mpq_clear(m)
mpq_clear(n)
PrintN("")

PrintN(" floating point mpf ------------------------------------------------------------") 

x.mpf 
y.mpf 
z.mpf 
w.mpfr

mpf_init2(x,256)
mpf_init2(y,256)
mpf_init2(z,256)
mpf_set_str(x,"2",10)
mpf_sqrt(y,x)
s=Space(256)
gmp_sprintf(s,"%57.52Fe",y)
PrintN(" y = sqrt(2) = "+s)
mpf_pow_ui(z,y,2)
s=Space(256)
gmp_sprintf(s,"%57.52Fe",z)
PrintN(" z = y ^ 2   = "+s)
mpf_clear(z)
mpf_clear(y)
mpf_clear(x)
PrintN("")

PrintN(" floating point mpfr -----------------------------------------------------------") 
mpfr_init2(w,256)
mpf_init2(x,256)
mpz_init(k)

l.l=2
;mpfr_set_str(w,"2",10,#MPFR_RNDN)
mpfr_set_ui(w,l,#MPFR_RNDN) ;set multi-precision w to the value in integer l
mpfr_log10(w,w,#MPFR_RNDN)
;mpfr_to_mpf(w,x,k) ; convert mpfr w to mpf in x so we can use sprintf
s=Space(256)
mpfr_sprintf (s,"%57.52R*e", #MPFR_RNDN, w)
;gmp_sprintf(s,"%57.52Fe",x)
PrintN(" w = log10(2) = "+s)

mpfr_exp10(w,w,#MPFR_RNDN)
;mpfr_to_mpf(w,x,k)
s=Space(256)
mpfr_sprintf (s,"%57.52R*e", #MPFR_RNDN, w)
;gmp_sprintf(s,"%57.52Fe",x)
PrintN(" w = exp10(w) = "+s)
PrintN("")

mpfr_clear(w)
mpf_clear(x)
mpz_clear(k)

;- random ------------------------------------------------------------------ 
PrintN(" random numbers ------------------------------------------------------------") 
rand_state.gmp_randstate_t
rand_num.mpz
ran_bnd.mpz
rand_bits.l=64

mpz_init(@rand_num)
mpz_init(@ran_bnd)

;mpz_set_str(@ran_bnd,"200",10)
gmp_randinit_default(@rand_state)
gmp_randseed_ui(@rand_state, 1234567890)

For r=1 To 10
  mpz_urandomb(@rand_num, @rand_state, rand_bits)
  s=Space(256)
  gmp_sprintz(s,"%Zd",@rand_num)
  PrintN(s)
Next  
mpz_clear(@ran_bnd)
mpz_clear(@rand_num)
gmp_randclear(@rand_state)
;- end random ------------------------------------------------------------------ 
PrintN(PeekS(mpfr_print_rnd_mode(#MPFR_RNDN)))

mpfr_init2(w,1000000*3.321928094887362)
time1.l=ElapsedMilliseconds()
mpfr_const_pi(w, #MPFR_RNDN)
PrintN(Str(ElapsedMilliseconds()-time1))
*sp=AllocateMemory(1000020)
*s1=AllocateMemory(100)
mpfr_sprintfp (*sp,"%.1000000R*f", #MPFR_RNDN, w)
For p.l=0 To 12;987
  CopyMemory(*sp+p*77, *s1, 77)
  PrintN(PeekS(*s1))
Next
mpfr_clear(w)
FreeMemory(*s1)
FreeMemory(*sp)

Print("press the return key to end. ")
Input()
CloseConsole() 
End

Re: "Exact" Calculations...

Posted: Thu Feb 04, 2016 8:51 pm
by Frarth
LIB files are not easy to find. :? The files I found so far either give 'corrupt' or "invalid machine type". I'll keep trying.

Re: "Exact" Calculations...

Posted: Thu Feb 04, 2016 8:58 pm
by Frarth
There is another version I just found here: http://www.purebasic.fr/english/viewtop ... 33#p458533

It uses OpenLibrary instead of Import and this seems to work with the same library files.

Thanks.