10
votes

Flotteur32 à flotteur16

Quelqu'un peut-il m'expliquer comment je convertira une valeur de point flottante de 32 bits en une valeur de point flottante de 16 bits?

(S = signe E = exponent et m = MANTISSA) P>

Si Float 32 bits est 1S7E24M de
Et le flotteur 16 bits est 1s5e10m p>

alors est-il aussi simple que cela que fait? P> xxx pré>

Je suppose que ce n'est pas si simple ... Alors quelqu'un peut-il me dire ce que vous avez besoin de faire? P>

EDIT: i cam voir que j'ai mon exposant change faux ... alors cela serait-il mieux? P>

fltInt16    =  ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16    |= ((fltInt32 & 0x80000000) >> 16);


4 commentaires

Je pense que cela a déjà été posé (et répondit) ici: Stackoverflow.com/Questtions/1659440/...


Cela pourrait être aussi simple, mais vous perdez une précision à moins que Float32 n'utilise pas toute la "précision" qu'elle a ... Fondamentalement, vous obtenez 5/7 des bits d'exp (vous prenez bien sûr les plus significatifs), et 10 / 24 de la mantissie; Ces ratios disent que ce que vous pouvez perdre dans la conversion. Comme cela se produit exactement si vous souhaitez installer 32bits entier dans un entier de 16bits ... La gamme de nombres rappréciables est plus petite; "Couper" La Mantissa réduit la "précision" et l'exposant limite également la plage: 5 bits signés donnent -16 à +15, contre -64 / + 63 (si je le faisais bien ...: D Terminer c'est)


@Shintakezzou: Ce n'est sûrement pas possible de perdre 16 bits de données et de ne pas perdre de précision ?? Float16 est beaucoup moins précis et a donc automatiquement moins de précision ... ou je vais vous mal comprendre?


vous pouvez perdre 16 bille et avoir le "float16" représentant le même nombre de float32, il vous suffit simplement de "choisir" le numéro float32 de sorte qu'il arrive ... mais normalement on ne peut pas choisir, de sorte que la plupart des Le moment où se passe-t-il est de perdre des informations. Parallèlement différemment, vous pouvez vous intégrer à Float32 tout numéro float16 (à condition que les mêmes conventions) et "retourne" à nouveau à flotteur16 sans perdre (F16> F32 ne "inventeras" "inventer" "de précision" et donc F16> F32> F16 'peut être fait pour que f16 '=== f16)


3 Réponses :


4
votes

Les exposants de vos représentations Float32 et Float16 sont probablement biaisés et biaisés différemment. Vous devez déguiser l'exposant que vous avez reçu de la représentation flottante 32 pour obtenir l'exposant réel, puis pour biais pour la représentation flottante16.

En dehors de ce détail, je pense que c'est aussi simple que cela, mais je suis toujours surpris par des représentations à virgule flottante de temps en temps.

EDIT:

  1. Vérifiez le débordement lorsque vous faites la chose avec les exponents pendant que vous y êtes.

  2. Votre algorithme tronque les derniers morceaux de la mantie un peu brusquement, cela peut être acceptable, mais vous voudrez peut-être mettre en œuvre, dire, rond-à proximité en regardant les bits sur le point d'être jetés. "0 ..." -> Round Bas, "100..001 ..." -> Round Up, "100..00" -> Round à même.


2 commentaires

Les nombres de points flottants 32 bits dans la norme IEEE754 ont 23 bits de MANTISSA et 8 bits exposant.


@budge ... assez juste J'essayais de le faire de la mémoire. J'ai pris le mauvais endroit, évidemment;)



4
votes

Voici le lien vers un article sur IEEE754, qui donne les mises en page et les biais de bit.

http://fr.wikipedia.org/wiki/eeee_754-2008


0 commentaires

8
votes

L'exponent doit être impartial, serré et reboisé. Ceci est le code rapide que j'utilise: xxx

Ce code sera encore plus rapide avec une table de recherche pour l'exposant, mais j'utilise celui-ci car il est facilement adapté à un flux de travail SIMD.

limitations de la mise en œuvre:

  • Les valeurs débordantes qui ne peuvent pas être représentées dans Float16 donneront des valeurs non définies.
  • Les valeurs de dérive retourneront une valeur non définie entre 2 ^ -15 et 2 ^ -14 au lieu de zéro.
  • Denormals donnera des valeurs non définies.

    Soyez prudent avec des disormaux. Si votre architecture les utilise, elles peuvent ralentir énormément votre programme.


0 commentaires