Magazine High tech

Nombres de précision arbitraire avec Bigloo

Publié le 07 novembre 2009 par Lbloch

Il est d'usage que les langages Lisp (et d'autres, comme Ruby) offrent un type de données numériques nommé bignum ; les nombres de ce type peuvent avoir une précision arbitraire, c'est-à-dire que leur nombre de chiffres avant comme après la virgule n'est limité que par l'espace mémoire disponible. Les calculs effectués sur de tels nombres seront bien plus lents qu'avec les types qui correspondent aux dispositifs natifs de l'ordinateur, mais pour certaines applications numériques cela peut être utile. Bigloo offre un type bignum.

La seule façon de créer un nombre de type bignum consiste à en introduire les chiffres dans une chaîne de caractères et à la convertir en nombre par la procédure string->bignum :

  1. 1:=> (define p (string->bignum "42"))
  2. p
  3. 1:=> (bignum? p)
  4. #t
  5. 1:=> p
  6. #z42
  7. 1:=>
Télécharger

Il est possible d'utiliser la possibilité procurée par Bigloo de créer des variables avec un type explicite, c'est-à-dire une annotation accolée au nom de la variable qui permettra au compilateur de produire un programme plus efficace (cf. pour des explications plus complètes le manuel Bigloo) :

  1. 1:=> (define p::bignum (string->bignum "42"))
  2. p
Télécharger

Voici par exemple un programme de factorielle qui permet d'obtenir le résultat voulu pour d'assez grands nombres :

  1. (define (fact-big n::int)
  2. (let calcul ((c::int 1)
  3. (p::bignum (string->bignum "1")))
  4. (if (> c n)
  5. p
  6. (calcul (+ c 1) (* c p))) ))
Télécharger 1:=> (fact-big 56) #z710998587804863451854045647463724949736497978881168458687447040000000000000

Le même programme, prêt à être compilé :

  1. (module fact-big
  2. (main get-n))
  3. ;;
  4. (define (get-n argv)
  5. (print (fact-big (string->integer (cadr argv)))))
  6. ;;
  7. (define (fact-big n::int)
  8. (let calcul ((c::int 1)
  9. (p::bignum (string->bignum "1")))
  10. (if (> c n)
  11. p
  12. (calcul (+ c 1) (* c p))) ))
Télécharger

Compilation et exécution :

$ bigloo factbig.scm -o fact-big $ ./fact-big 42 1405006117752879898543142606244511569936384000000000

Retour à La Une de Logo Paperblog

A propos de l’auteur


Lbloch 52 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte