Esempio di utilizzo delle funzioni esterne del API di GMP

Da Gambas-it.org - Wikipedia.

GMP è una libreria gratuita per effettuare calcoli aritmetici di precisione. Tale libreria opera su interi con segno, numeri razionali e numeri in virgola mobile. Non vi è sostanzialmente alcun limite pratico alla precisione tranne quelli legati alla memoria disponibile nella macchina sulla quale si sta usando la libreria GMP.

Per poter utilizzare le riors della libreria GMP, è necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libgmp.so.10.4.1 ".

Mostriamo di seguito un semplice esempio pratico, nel quale si effettuerà una moltiplicazione che restituirà un prodotto formato da un numero, la cui dimensione non sarebbe supportata normalmente dalle capacità di Gambas:

Library "libgmp:10.4.1"

Public Struct __mpz_struct
  _mp_alloc As Integer
  _mp_size As Integer
  _mp_d As Pointer
End Struct

' int mpz_init_set_str (mpz_t rop, const char *str, int base)
' Initialize rop.
Private Extern __gmpz_init_set_str(rop As __mpz_struct, st As String, base As Integer) As Integer

' void mpz_init (mpz_ptr x)
' Initialize x, and set its value to 0.
Private Extern __gmpz_init(x As __mpz_struct)

' void __gmpz_mul (mpz_t rop, const mpz_t op1, const mpz_t op2)
' Set rop to op1 times op2.
Private Extern __gmpz_mul(rop As __mpz_struct, op1 As __mpz_struct, op2 As __mpz_struct)

' int __gmp_printf (const char *, ...)
' Accept format strings similar to the standard C printf.
Private Extern __gmp_printf(ris As String, mpz_ptr As __mpz_struct, mpz_ptr As __mpz_struct, mpz_ptr As __mpz_struct) As Integer

' void mpz_clear (mpz_t x)
' Free the space occupied by x.
Private Extern __gmpz_clear(x As __mpz_struct)


Public Sub Main()

 Dim x, y, result As New __mpz_struct
 
 __gmpz_init_set_str(x, "8723169365849056", 10)
 __gmpz_init_set_str(y, "7374602239540192", 10)
 __gmpz_init(result)
   
 __gmpz_mul(result, x, y)
   
 __gmp_printf("                %Zd *\n" &
              "                %Zd\n" &
              "--------------------------------\n" &
              "%Zd\n", x, y, result)
  
 __gmpz_clear(x)
 __gmpz_clear(y)
 __gmpz_clear(result)
  
End


Riferimenti