"Exact" Calculations...

Just starting out? Need help? Post your questions and find answers here.
User avatar
Michael Vogel
Addict
Addict
Posts: 2807
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

"Exact" Calculations...

Post 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()

jack
Addict
Addict
Posts: 1358
Joined: Fri Apr 25, 2003 11:10 pm

Post 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
User avatar
Michael Vogel
Addict
Addict
Posts: 2807
Joined: Thu Feb 09, 2006 11:27 pm
Contact:

Post 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:
User avatar
Frarth
Enthusiast
Enthusiast
Posts: 241
Joined: Tue Jul 21, 2009 11:11 am
Location: On the planet
Contact:

Re: "Exact" Calculations...

Post 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"
PureBasic 5.41 LTS | Xubuntu 16.04 (x32) | Windows 7 (x64)
jack
Addict
Addict
Posts: 1358
Joined: Fri Apr 25, 2003 11:10 pm

Re: "Exact" Calculations...

Post 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
User avatar
Frarth
Enthusiast
Enthusiast
Posts: 241
Joined: Tue Jul 21, 2009 11:11 am
Location: On the planet
Contact:

Re: "Exact" Calculations...

Post 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.
PureBasic 5.41 LTS | Xubuntu 16.04 (x32) | Windows 7 (x64)
User avatar
Frarth
Enthusiast
Enthusiast
Posts: 241
Joined: Tue Jul 21, 2009 11:11 am
Location: On the planet
Contact:

Re: "Exact" Calculations...

Post 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.
PureBasic 5.41 LTS | Xubuntu 16.04 (x32) | Windows 7 (x64)
Post Reply