web-dev-qa-db-fra.com

Comment effectuer des rondes à égales avec des nombres à virgule flottante

En ce qui concerne la virgule flottante simple précision IEEE-754, comment effectuez-vous le tour le plus proche, là où le nombre est égal au chiffre pair le plus proche dans la position requise (mode par défaut et de loin le plus courant)?

En gros, j'ai le bit de garde, le bit rond et le bit collant. Donc, si nous formons ceux-ci en un vecteur et que nous l'appelons GRS, les règles suivantes s'appliquent:

  1. Si G = 0, arrondissez au bas (ne rien faire)
  2. Si G = 1 et RS == 10 ou RS == 01, arrondissez (ajoutez un à mantisse)
  3. si GSR = 111, arrondir à même

Donc, je ne suis pas sûr de savoir comment effectuer le tour au plus proche. Toute aide est grandement appréciée.

18
Veridian

Juste pour être sur que nous sommes sur la même page, G est le bit le plus significatif des trois, R vient ensuite et S peut être considéré comme le bit le moins significatif car sa valeur représente partiellement les bits encore moins significatifs qui ont été tronqués dans les calculs. Ces trois bits ne sont utilisés que dans les calculs et ne sont pas stockés dans la variable à virgule flottante avant ou après les calculs.

Voici ce que vous devez faire pour arrondir le résultat au nombre pair le plus proche en utilisant G, R et S:

GRS- Action
0xx - arrondir à la baisse = ne rien faire (x signifie n'importe quelle valeur de bit, 0 ou 1)
100 - il s'agit d'un tie : arrondir si le bit de la mantisse juste avantGvaut 1, sinon arrondir = ne rien faire
101 - arrondir
110 - arrondir
111 - arrondir

Pour arrondir, vous devez ajouter 1 à la mantisse dans la position de bit la moins significative de la mantisse juste avant G. Si la mantisse déborde (ses 23 bits les moins significatifs que vous allez stocker deviennent des zéros), vous devez ajouter 1 à l'exposant. Si l'exposant déborde, vous définissez le nombre sur + infini ou -infinity en fonction du signe du nombre.

Dans le cas d'une égalité, vous ajoutez 1 à la mantisse si la mantisse est étrange et vous n'ajoutez rien si elle est paire. C'est ce qui rend le résultat arrondi à la valeur paire la plus proche.

30
Alexey Frunze

Je voulais juste ajouter queSbit n'est pas juste un peu aprèsGRbits. S'il y a des bits disponibles après GRSbits, il s'agit en fait d'unOUlogique, y comprisSbit.
En d’autres termes, s’il ya un bit aprèsGRbits qui est 1 , alors la valeur du bitSsera 1 .

5
NSH

Pour arrondir, tenez compte des éléments suivants lorsque vous avez un jeu de bits inférieur à la précision que vous conservez:

  1. Si le bit le moins significatif que vous conservez est 0, ajoutez simplement 0x7ff .... f aux bits d'arrondi. 
  2. Si le bit le moins significatif que vous gardez est 1, ajoutez 0x800 .... 0 aux bits d’arrondi.

Je pense que cela implémente le comportement souhaité en effectuant un seul test.

0
Dick Bertrand