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

Algorithmes et structures de données Discussion :

[IEEE 754] Comment calculer un arrondi ?


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Points : 3
    Points
    3
    Par défaut [IEEE 754] Comment calculer un arrondi ?
    Bonjour à tous,

    je travaille actuellement sur l'arithmétique flottante pour un examen de fin d'année, et j'ai quelques problèmes sur la méthode pour arrondir les flottants dans les 4 modes d'arrondi définit par la norme IEEE 754.

    - arrondi au plus près
    - arrondi vers plus infini
    - arrondi vers moins infini
    - arrondi vers zéro

    Ces 4 arrondis correspondent respectivement aux fonctions suivantes (lib math.h) :

    - round()
    - ceil()
    - floor()
    - trunc()

    J'ai codé un petit programme qui permet de calculer les arrondis pour un nombre flottant donné :

    $ ./float2bin 3.4655 5
    3.4655000000
    bin => 0 10000000 10111011100101011000001
    -----
    Arrondi vers le haut: dec => 3.4655100000 bin => 0 10000000 10111011100101011101010
    Arrondi vers le bas: dec => 3.4655000000 bin => 0 10000000 10111011100101011000001
    Arrondi au plus proche: dec => 3.4655000000 bin => 0 10000000 10111011100101011000001
    Arrondi vers zéro: dec => 3.4655000000 bin => 0 10000000 10111011100101011000001
    -----
    Cela dit, j'ai beau comparer plusieurs résultats, lire beaucoup de documentation sur internet, mais je ne trouve pas la méthode ...

    Alors si quelqu'un peut expliquer la méthode "mathématique" pour réaliser ces arrondis, je le remercie d'avance !!

    Merci d'avance pour toutes les éventuelles réponses à ce sujet.

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Une petite idée pour retrouver l'implémentation : récupérer la source d'une bibliothèque C, celle de gnu par exemple : http://ftp.gnu.org/gnu/glibc/ et aller voir les implémentations des fonctions voulues.

    Exemple, pour i386 :
    Code c : 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
    __MATH_INLINE double floor (double __x);
    __MATH_INLINE double
    floor (double __x)
    {
      register double __value;
      __volatile unsigned short int __cw, __cwtmp;
     
      __asm __volatile ("fnstcw %0" : "=m" (__cw));
      __cwtmp = (__cw & 0xf3ff) | 0x0400; /* rounding down */
      __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
      __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
      __asm __volatile ("fldcw %0" : : "m" (__cw));
     
      return __value;
    }
     
    __MATH_INLINE double ceil (double __x);
    __MATH_INLINE double
    ceil (double __x)
    {
      register double __value;
      __volatile unsigned short int __cw, __cwtmp;
     
      __asm __volatile ("fnstcw %0" : "=m" (__cw));
      __cwtmp = (__cw & 0xf3ff) | 0x0800; /* rounding up */
      __asm __volatile ("fldcw %0" : : "m" (__cwtmp));
      __asm __volatile ("frndint" : "=t" (__value) : "0" (__x));
      __asm __volatile ("fldcw %0" : : "m" (__cw));
     
      return __value;
    }

Discussions similaires

  1. IEEE 754 soustraction et arrondi au plus proche puis nombre pair
    Par Iradrille dans le forum Mathématiques
    Réponses: 0
    Dernier message: 17/05/2014, 08h35
  2. Comment calculer la taille d'une base de données ?
    Par say dans le forum Décisions SGBD
    Réponses: 8
    Dernier message: 01/04/2011, 16h48
  3. [Matrices] Comment calculer le Déterminant d'une matrice 4x4
    Par cyber_N dans le forum Algorithmes et structures de données
    Réponses: 70
    Dernier message: 19/08/2005, 15h47
  4. comment calculer le temps d'execution
    Par passion_info dans le forum C++Builder
    Réponses: 1
    Dernier message: 09/06/2005, 09h13
  5. Réponses: 2
    Dernier message: 05/01/2005, 14h36

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