Convertir int 16 bits float (la moitié de précision à virgule flottante) en c++
Comment puis-je convertir un integer
à un half precision float
(qui doit être stocké dans un tableau unsigned char[2]
). La gamme à l'entrée int sera de 1 à 65535. La précision n'est pas vraiment un souci.
Je suis en train de faire quelque chose de similaire pour la conversion à l' 16bit int
dans un unsigned char[2]
, mais je comprends, il n'est pas half precision float
C++ type de données. Exemple ci-dessous:
int16_t position16int = (int16_t)data;
memcpy(&dataArray, &position16int, 2);
Peut-être pertinentes : gamedev.stackexchange.com/a/17410/9333
Avec la pointe de Goz peut-être de les aider: 32 bits à 16 bits à virgule Flottante Conversion
Avec la pointe de Goz peut-être de les aider: 32 bits à 16 bits à virgule Flottante Conversion
OriginalL'auteur Ross | 2012-10-10
Vous devez vous connecter pour publier un commentaire.
C'est très simple chose, toutes les informations dont vous avez besoin dans Wikipédia.
Exemple de mise en œuvre:
De sortie (ideone):
simple si vous savez assez de mathématiques au secondaire.
Il convient de noter que ce code a anormaux arrondissement comportement. En grande partie, il tronque plutôt que des tours à la plus proche (ce qui est plus fréquent), mais est anormale à l'extrémité supérieure. Entrées supérieur à la valeur maximale représentable finis valeur sont convertis à l'infini, plutôt que d'être tronqué à l'instar d'autres entrées, même si elles ne sont que légèrement supérieure à la valeur maximale. Par exemple 0xfff (4095) est converti à 0x6bff (4094), mais 0xfff0 (65520) ou 0xffe1 (65505) est converti à 0x7c00 (infini) plutôt que de 0x7bff (65504).
Vous avez raison. Mais c'était mon interprétation de
Precision is really not a concern
.OriginalL'auteur Alexey Frunze
J'ai posé la question de comment faire pour convertir 32-bit floating points à 16 bits à virgule flottante.
Float32 pour Float16
À partir de laquelle vous pouvez facilement convertir l'int d'un flotteur et d'utiliser ensuite la question ci-dessus pour créer un 16-bit à virgule flottante. Je suggère que c'est probablement beaucoup plus facile que de passer de int directement sur 16 bits à virgule flottante. Effectivement, par la conversion à virgule flottante de 32 bits que vous avez fait la plupart du labeur et puis vous avez juste besoin de passer un peu de bits.
Edit: en Regardant Alexey excellente réponse je pense qu'il est très probable que l'utilisation d'un matériel int float conversion et le décalage de bits autour est susceptible d'être un peu juste plus rapide que sa méthode. Peut-être la peine de profilage des deux méthodes et en les comparant.
OriginalL'auteur Goz
Suivant @kbok question commentaire que j'ai utilisé la première partie de cette réponse pour obtenir la moitié de flotter et d'obtenir ensuite le tableau:
OriginalL'auteur Ross
Si vous visez pour le matériel pris en charge, vous pouvez utiliser intrinsèques:
https://software.intel.com/en-us/articles/performance-benefits-of-half-precision-floats
https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-7679FF37-257B-4F90-8668-5B3AA62587AD.htm
OriginalL'auteur Ben-Uri