Comment puis-je enregistrer un nombre à virgule flottante dans les 2 octets?
Oui, je suis conscient de la norme IEEE-754 demi-précision norme, et oui je suis conscient du travail accompli dans le domaine. Mettez tout simplement, j'essaie de sauver un simple nombre à virgule flottante (comme 52.1
, ou 1.25
) en seulement 2 octets.
J'ai essayé certaines implémentations dans Java et dans C# mais ils ruinent la valeur d'entrée par le décodage d'un nombre différent. Vous nourrissez dans 32.1
et après coder-décoder vous obtenez 32.0985
.
Est-il possible que je peux stocker des nombres à virgule flottante en seulement 16-bits sans ruiner la valeur d'entrée?
Merci beaucoup.
- Binaire floatingpoints ne pouvez pas encoder
32.1
- Quel est l'éventail des numéros de avez-vous besoin de coder, et combien de chiffres significatifs ont-ils? Envisager virgule fixe ou flottante points.
- Vous pouvez les stocker comme un
unsigned short
, avec quelques bits utilisés pour l'exponentielle de la partie? Vous pouvez ensuite convertir manuellement de retour de ce format régulier de simple précisionfloat
. - Ce CodeInChaos dit mot pour mot...
- Qui ne permettent pas de résoudre le problème de la représentation.
- Vous devez être plus précis avec votre énoncé du problème. Deux octets peut représenter au plus 65536 différentes valeurs à virgule flottante. Ceux qui sont celles que vous voulez? Pire des cas, vous pouvez avoir un tableau de "la 65536 valeurs à virgule flottante-je me soucier de" et de rendre les deux octets de la valeur d'une recherche.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez stocker à trois chiffres en BCD et utiliser le reste de quatre bits pour la position du point décimal:
Ce serait vous donner une gamme de 0.0000000000000001 à 999. Vous pouvez bien sûr ajouter un offset pour le point décimal pour obtenir par exemple la gamme 0.0000000001 à 999000000.
Simple de mise en œuvre de quatre bits utilisés pour le point décimal de placement, et le reste pour la valeur. Sans aucune vérification d'erreur, et de ne pas soigneusement vérifiée. (Peut avoir de la précision des problèmes avec certaines valeurs lors de l'utilisation de
!=
de comparer doubles.)Exemple:
De sortie:
1.5
est le même que001.5
ou1.500
.C# n'a pas intégré dans les fonctionnalités, mais vous pouvez essayer un point fixe de l'approche.
Exemple de 8,8 point Fixe (8 avant la virgule, 8 après):
De cette façon, le nombre est stocké comme ceci:
XXXXXXXX XXXXXXXX
et vous pouvez récupérer le flotteur de nouveau l'utilisation de ce:
Êtes-vous sûr que vous avez besoin d'une micro-optimisation, plus simplement, à l'aide d'un
float
oudouble
?Vous serait mieux servi par le stockage d'un
short
et la compréhension que, par exemple, il est divisé par 100 pour faire le nombre réel? (E. g. vos exemples de 52,1 et 1,25 pourrait être stockées en tant que 5210 et 125) je pense que cela pourrait être la meilleure solution pour vous.Si vous êtes fixés sur l'aide d'un nombre à virgule flottante, vous pouvez prendre le décodé nombre et autour d'elle à x chiffres significatifs, (à partir de votre exemple, 3), qui doit généralement vous obtenir de nouveau le même nombre de départ (notez que oui, c'est intentionnellement vague - vous ne pouvez pas garantir l'obtention de l'original, à moins que vous stockez l'original).
Le problème est que vous ne pouvez pas représenter
32.1
dans tout binaire à virgule flottante type.En simple précision, le plus proche de la valeur représentable est 32.099998.
Dans la demi-précision, il est apparemment 32.0985.
Vous pourriez envisager un nombre décimal à virgule flottante type, mais cette solution n'est pas unique à la moitié de précision.
32.1
sera 32+3/32 (un.k.un. 1027/32) qui est32.09375
. Donc votre "apparemment" n'est pas correct, après tout. Je ne sais pas où le demandeur a son exemple de. Pour une demi-valeur de précision, vous le feriez normalement, sortie seulement 3 chiffres après la virgule, donc"32.1"
serait l'habitude de précision.Il y a 4,278,190,080 32 bits à virgule flottante valeurs, non compris les NaNs et infinis. Il y a de 65 536 valeurs de 16 bits sur deux octets. Clairement, il est impossible de bien coder toutes les valeurs à virgule flottante dans deux octets.
Quelles sont celles que vous souhaitez encoder?
Même pour une seule valeur de la signer et de l'exposant (par exemple, toutes les valeurs à virgule flottante de 4 à 8, pas 8), il y a 8,388,608 des valeurs à virgule flottante, de sorte que vous ne pouvez même pas coder dans deux octets.
Vous devez vous limiter à un petit sous-ensemble de valeurs à coder. Une fois que vous avez fait cela, les gens peuvent avoir des suggestions sur la façon de coder. Quel est le problème que vous essayez de résoudre?
De vos exemples que vous souhaitez stocker 3 chiffres et point décimal. Il vous suffit d'encoder votre "alphabet" de 11 des symboles dans un 4 bits de code, et le magasin 4 x 4 bits 2 octets.