IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Caml Discussion :

Utiliser le type Num


Sujet :

Caml

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut Utiliser le type Num
    Bonjour,

    Voilà j'ai un petit souci avec ce type de données (plus d'info ici : http://caml.inria.fr/pub/docs/manual...ibref/Num.html), j'aimerais simplement faire une division de 2 entiers et en sortir un nombre décimal très grand.
    Mon exemple : 103993 / 33102, qui doit donner une approximation de pi.
    En caml, ça me donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #load "nums.cma";;
    open Num;;
     
    (*Version 1 :*)
    Int 103993 // Int 33102;;
    (*Résultat*)
    - : Num.num = Ratio <abstr>
     
    (*Version 2 :*)
    let printnum n = print_string (string_of_num n);;
    #install_printer printnum;;
    let n = Int 103993 // Int 33102;;
    printnum n;;
    (*Résultat*)
    103993/33102- : unit = ()
    Si je remplace mon "//" par une addition (+/), une multiplication (*/) ou une soustraction (-/), j'ai un résultat qui s'affiche correctement et tout va bien dans les 2 cas.
    Mais pour la division, rien à faire.
    Quelqu'un a une solution pour ma simple division ?

  2. #2
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par AlexiZ
    j'aimerais simplement faire une division de 2 entiers et en sortir un nombre décimal très grand.
    Le résultat de Num.(//) est un nombre rationnel c'est-à-dire ∈ ℚ.

    Si tu veux calculer dans ℕ il faut utiliser le module Big_int.

    PI en goutte-à-goutte (exact, temps ∞) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #load "nums.cma";;
    let add  = Big_int.add_big_int
    and sub  = Big_int.sub_big_int
    and succ = Big_int.succ_big_int
    and pred = Big_int.pred_big_int
    and mult = Big_int.mult_big_int
    and div  = Big_int.div_big_int
    and add_int  = Big_int.add_int_big_int
    and mult_int = Big_int.mult_int_big_int
    and big_int  = Big_int.big_int_of_int
    and int_of   = Big_int.int_of_big_int
    ;;
    let pi () =
      let rec g q r t i =
        let i3 = mult_int 3 i in
        let u = mult_int 3 (mult (add_int 1 i3) (add_int 2 i3))
        and y = int_of (div (add (mult q (add_int (-12) (mult_int 27 i))) (mult_int 5 r)) (mult_int 5 t)) 
        in begin
          print_int y;
          flush stdout;
          g
          (mult_int 10 (mult q (mult i (add_int (-1) (mult_int 2 i)))))
          (mult_int 10 (mult u (sub (add (mult q (add_int (-2) (mult_int 5 i))) r) (mult_int y t))))
          (mult t u)
          (add_int 1 i);
          ()
        end
      in g (big_int 1) (big_int 180) (big_int 60) (big_int 2);; 
    
    pi ();;

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Merci d'avoir répondu.

    L'objectif n'est pas de cacluler dans ℕ mais bien dans ℚ. Est-ce que c'est possible ?
    La méthode du goutte à goutte donne bien un nombre important de décimales mais je ne comprends pas vraiment comment cela fonctionne, une précision sur les paramètres de g ?

  4. #4
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par AlexiZ Voir le message
    L'objectif n'est pas de cacluler dans ℕ mais bien dans ℚ. Est-ce que c'est possible ?
    Oui, c'est possible en utilisant le module Num.

    Citation Envoyé par AlexiZ Voir le message
    une précision sur les paramètres de g ?
    http://web.comlab.ox.ac.uk/oucl/work...ons/spigot.pdf

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2012
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Décembre 2012
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par SpiceGuid Voir le message
    Oui, c'est possible en utilisant Num.(//)
    ça va pas être simple
    Mais en tout cas merci, je vais voir avec tout ça pour trouver quelque chose de probant.
    Juste une dernière question en passant, je ne peux pas utiliser "power_num" sans avoir une "Exception : invalid argument power_num", une idée ?

  6. #6
    Membre émérite
    Avatar de SpiceGuid
    Homme Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 704
    Points : 2 990
    Points
    2 990
    Par défaut
    Citation Envoyé par AlexiZ Voir le message
    L'objectif n'est pas de cacluler dans ℕ mais bien dans ℚ. Est-ce que c'est possible ?
    Ne reviens pas demain pour nous dire qu'en fait tu veux calculer ∏ dans ℝ

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 06/12/2005, 16h54
  2. [D2005] Utilisation des types énumérés
    Par bouha dans le forum Delphi .NET
    Réponses: 2
    Dernier message: 21/07/2005, 22h21
  3. Erreur utilisation de type indéfini
    Par hanane_iaai dans le forum C++
    Réponses: 3
    Dernier message: 04/07/2005, 17h34
  4. [HTML]Utilisation du type file
    Par Kuroro dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 23/12/2004, 16h12
  5. utilisation du type DATE d'interbase
    Par dibak dans le forum InterBase
    Réponses: 4
    Dernier message: 05/01/2004, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo