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 :

Problème de précision float en OCaml


Sujet :

Caml

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 20
    Points : 15
    Points
    15
    Par défaut Problème de précision float en OCaml
    Bonjour,

    je suis débutant en Caml et j'utilise le système interprété d'OCaml (version 4.01.0).

    Voici mon problème :
    Nom : ProblemePrecision.png
Affichages : 550
Taille : 3,4 Ko
    Je fais simplement 42.456 -. 42.0, je devrais donc obtenir 0.456 !

    Merci à la personne qui saura me dire d'où vient ce problème de précision, et comment y remédier si c'est possible :)

  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
    Effectivement :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # 1. /. 3.;;
    - : float = 0.33333333333333331
    # 42.456 -. 42.;;
    - : float = 0.45600000000000307

    Alors que la calculatrice de Windows XP résulte bien 0.456 pour la même opération.
    Le type float ocaml est le type IEEE double précision 64 bits.
    Or les cpu x86 possèdent (également) un type float étendu à 80 bits.
    C'est (peut-être) ce qui explique la différence.
    Ou bien alors la calculatrice Windows affiche juste moins de digits.
    • OCaml peut-il utiliser le type x86 étendu à 80 bits ? Non, pas à ma connaissance.
    • Il y a plusieurs solutions pour atteindre la précision souhaitée si elle est nécessaire.


    Utiliser un type entier ou entier long (exemple avec Int64) :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # Int64.sub 4245600000000000000L 4200000000000000000L;;
    - : int64 = 45600000000000000L

    Utiliser le type entier de précision arbitraire Num.num :
    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # #load "nums.cma";;
    # open Num;;
    # (num_of_string "4245600000000000000") -/ (num_of_string "4200000000000000000");;
    - : Num.num = Big_int <abstr>

    Sinon il reste la possibilité d'utiliser un binding Multi-Precision.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci pour cette réponse très précise !
    Sujet résolu

  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 Par manque de certitudes j'ai omis le plus important
    Dans la plupart des cas on n'a pas besoin d'une précision arbitraire.
    Alors qu'est-ce qu'on fait d'un flottant comme 0.45600000000000307 ?
    Hé bien on fait comme on ferait en C : on le castre en limitant sa précision à l'aide de Printf.printf.

    Code OCaml : Sélectionner tout - Visualiser dans une fenêtre à part
    Printf.printf "%.2f\n" (42.456 -. 42.);;

    %f signifie qu'on affiche un float en notation décimale et .2 signifie qu'on affiche seulement 2 décimales après la virgule.
    Deux décimales ça suffit pour des valeurs monétaires où on ne s'intéresse qu'aux centimes.
    Pour d'autres applications on peut désirer davantage de décimales.

    avertissement: depuis la version ocaml 4.0 il y a eu un changement dans les paramètres d'affichage formatés.
    Du coup je ne suis pas certain que mon Printf.printf "%.2f" soit le dernier truc cool à la mode gadt. Si quelqu'un a une alternative plus fun qu'il se fasse un plaisir de nous la faire connaître, merci d'avance.
    Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
    Avant de poser une question je lis les règles du forum.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    En tout cas, l'affichage formaté fonctionne bien sous ma version 4.01.0. Merci encore :)

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

Discussions similaires

  1. problème de précision sur un float
    Par Toitoine dans le forum Débuter
    Réponses: 4
    Dernier message: 26/10/2007, 09h10
  2. Problème de précision avec FloatToStr
    Par Clorish dans le forum Langage
    Réponses: 9
    Dernier message: 06/12/2005, 15h38
  3. [XHTML] problème avec les float:left
    Par glloq8 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/11/2005, 17h15
  4. Réponses: 4
    Dernier message: 26/10/2005, 20h38
  5. [FLASH MX] Problème de "précision"
    Par will-scs dans le forum Flash
    Réponses: 2
    Dernier message: 03/07/2005, 00h31

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