Это длинное непонятное число всего лишь 2^64-1. Давно искал библиотеки работы с большими числами, нашел трэд на форуме с дохлыми ссылками и засел за гугление. Нашел нужную либу, примеры использования, и с полпинка получил результат умножения. Получилось не сразу, так как компилятор по умолчанию создавал Unicode, что плохо совместимо с ANSI:(
Код вышел таким:
Structure mpz ; multiprecision integer
mp_alloc.l
mp_size.l
mp_limb.l
EndStructure
ImportC "libgmp-3.lib"
gmp_sprintz.l(dest.s,format.s,*n.mpz) As "___gmp_sprintf"
mpz_init(*integer.mpz) As "___gmpz_init"
mpz_clear(*integer.mpz) As "___gmpz_clear"
mpz_set_str.l(*rop.mpz,str.s,base.l) As "___gmpz_set_str"
mpz_mul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_mul"
mpz_get_str(*string, base.i, *op.mpz) As "___gmpz_get_str"
mpz_add(*rop.mpz, *op1.mpz, *op2.mpz) As "___gmpz_add"
EndImport
i.mpz
j.mpz
r.mpz
mpz_init(@i) ;gmpz_init(*x.mpz)
mpz_init(@j)
mpz_init(@r)
h$="FFFFFFFFFFFFFFFF"
mpz_set_str(@r,"",10)
For k=1 To Len(h$)
s1$="16"
mpz_set_str(@i,s1$,10);gmpz_set_str(*rop.mpz, string.p-ascii, base.i)
s2$=RSet(Str(Val("$"+Mid(h$,k,1))),2,"0")
mpz_set_str(@j,s2$,10)
mpz_mul(@r,@r,@i);mpz_mul(*rop.mpz, *op1.mpz, *op2.mpz)
mpz_add(@r,@r,@j);gmpz_add(*rop.mpz, *op1.mpz, *op2.mpz)
Next k
*m=AllocateMemory(10000)
mpz_get_str(*m, 10, @r);gmpz_get_str(*string, base.i, *op.mpz)
Debug PeekS(*m,-1,#PB_Ascii);18446744073709551615
FreeMemory(*m)
mpz_clear(@r) ;de-allocate memory
mpz_clear(@j)
mpz_clear(@i)
mp_alloc.l
mp_size.l
mp_limb.l
EndStructure
ImportC "libgmp-3.lib"
gmp_sprintz.l(dest.s,format.s,*n.mpz) As "___gmp_sprintf"
mpz_init(*integer.mpz) As "___gmpz_init"
mpz_clear(*integer.mpz) As "___gmpz_clear"
mpz_set_str.l(*rop.mpz,str.s,base.l) As "___gmpz_set_str"
mpz_mul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_mul"
mpz_get_str(*string, base.i, *op.mpz) As "___gmpz_get_str"
mpz_add(*rop.mpz, *op1.mpz, *op2.mpz) As "___gmpz_add"
EndImport
i.mpz
j.mpz
r.mpz
mpz_init(@i) ;gmpz_init(*x.mpz)
mpz_init(@j)
mpz_init(@r)
h$="FFFFFFFFFFFFFFFF"
mpz_set_str(@r,"",10)
For k=1 To Len(h$)
s1$="16"
mpz_set_str(@i,s1$,10);gmpz_set_str(*rop.mpz, string.p-ascii, base.i)
s2$=RSet(Str(Val("$"+Mid(h$,k,1))),2,"0")
mpz_set_str(@j,s2$,10)
mpz_mul(@r,@r,@i);mpz_mul(*rop.mpz, *op1.mpz, *op2.mpz)
mpz_add(@r,@r,@j);gmpz_add(*rop.mpz, *op1.mpz, *op2.mpz)
Next k
*m=AllocateMemory(10000)
mpz_get_str(*m, 10, @r);gmpz_get_str(*string, base.i, *op.mpz)
Debug PeekS(*m,-1,#PB_Ascii);18446744073709551615
FreeMemory(*m)
mpz_clear(@r) ;de-allocate memory
mpz_clear(@j)
mpz_clear(@i)
С другими примерами тоже нужно разбираться. И почитать документацию тоже не помешало бы.
Пример тут.
Дополнение. Переписал пример и добавил вычисление sqrt(2)
Structure mpz
mp_alloc.l
mp_size.l
mp_limb.l
EndStructure
ImportC "libgmp-3.lib"
mpz_init(*integer.mpz) As "___gmpz_init"
mpz_clear(*integer.mpz) As "___gmpz_clear"
mpz_set_str.l(*rop.mpz,str.s,base.l) As "___gmpz_set_str"
mpz_mul(*rop.mpz,*op1.mpz,*op2.mpz) As "___gmpz_mul"
mpz_get_str(*string, base.i, *op.mpz) As "___gmpz_get_str"
mpz_add(*rop.mpz, *op1.mpz, *op2.mpz) As "___gmpz_add"
mpz_init_set_ui(*rop.mpz, op.i) As "___gmpz_init_set_ui"
EndImport
i.mpz
j.mpz
r.mpz
mpz_init(@i)
mpz_init(@j)
mpz_init(@r)
h$="FFFFFFFFFFFFFFFF"
mpz_set_str(@r,"",10)
mpz_init_set_ui(@i, 16)
For k=1 To Len(h$)
mpz_init_set_ui(@j,Val("$"+Mid(h$,k,1)))
mpz_mul(@r,@r,@i)
mpz_add(@r,@r,@j)
Next k
*m=AllocateMemory(10000)
mpz_get_str(*m, 10, @r);gmpz_get_str(*string, base.i, *op.mpz)
Debug PeekS(*m,-1,#PB_Ascii);18446744073709551615
FreeMemory(*m)
mpz_clear(@r)
mpz_clear(@j)
mpz_clear(@i)
;sqrt(2)
Structure mpz
mp_alloc.l
mp_size.l
mp_limb.l
EndStructure
Structure mpf
mp_prec.i
mp_size.i
mp_expt.i
mp_limb.i
EndStructure
ImportC "libgmp-3.lib"
mpf_set_default_prec(prec.i) As "___gmpf_set_default_prec"
mpf_init(*x.mpf) As "___gmpf_init"
mpf_sqrt_ui(*rop.mpf, op.i) As "___gmpf_sqrt_ui"
mpf_get_str(*str, *expptr, base.i, n_digits.i, *op.mpf) As "___gmpf_get_str"
mpf_clear(*x.mpf) As "___gmpf_clear"
EndImport
result.mpf;mpf_t result; // floating point variable
;char *output; // holds the output result string
exp.l;mp_exp_t exp; // holds the exponent for the result string
*output=AllocateMemory(10000)
mpf_set_default_prec(1024); // set default precision in bits
mpf_init(@result); // allocate and init variable
mpf_sqrt_ui(@result, 2); // compute sqrt(2)
; // convert To string, And print:
mpf_get_str(*output, @exp, 10, 0, @result);
; printf("%.*s.%s\n", (int)exp, output, output+exp);
;ShowMemoryViewer(*output,1024)
r$=PeekS(*output,-1,#PB_Ascii)
Debug Mid(r$,1,exp)+"."+Mid(r$,exp+1)
; // clean up
FreeMemory(*output); // mpf_get_str() calls malloc()
mpf_clear(@result);
; 1.4142135623730950488016887242096980785696718753769480731766797379907
; 324784621070388503875343276415727350138462309122970249248360558507372
; 126441214970999358314132226659275055927557999505011527820605714701095
; 599716059702745345968620147285174186408891986095523292304843087143214
; 50839762603627995251407989687253396
Комментарии
Отправить комментарий