Je ne connais pas un bon moyen. Il peut certainement être fait à la dure, voici un exemple simple précision tout à fait dans JavaScript:
js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0/Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
18.899999618530273
Une mise en œuvre de la production devrait considérer que la plupart des champs ont des valeurs magiques, généralement mis en œuvre en spécifiant une interprétation particulière pour ce aurait été le plus grand ou le plus petit. Donc, détecter NaN
s et infinis. L'exemple ci-dessus devrait vérifier les négatifs. (& 0x80000000)
Mise à jour: Ok, je l'ai aussi pour les doublons. Vous ne pouvez pas étendre directement la technique ci-dessus parce que la représentation JS interne est un double, et donc par sa définition, elle peut gérer au mieux une chaîne de bits de longueur 52, et elle ne peut pas changer de plus de 32.
Ok, pour faire doublez vous coupez d'abord comme une chaîne les 8 chiffres bas ou 32 bits; traitez-les avec un objet séparé. Puis:
js> a = 0x40725082
1081233538
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js>
J'ai gardé l'exemple ci-dessus parce qu'il provient de l'OP. Un cas plus difficile est lorsque les 32 bits faibles ont une valeur. Voici la conversion de 0x40725082deadbeef, une double précision absolue:
js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0/Math.pow(2,52-32) * Math.pow(2, e) +
b * 1.0/Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js>
Il y a quelques sous-expressions évidentes que vous pouvez factoriser mais je l'ai laissé cette façon afin que vous puissiez voir comment il se rapporte au format.
Personnellement, je commencerais par hacher la valeur hexadécimale avec une regex dans les pièces séparées. Ensuite, je les évaluerais comme des entiers, et finalement j'essaierais de les transformer en flotteur. Cela semble être quelque chose qui va être difficile, car vous allez devoir le faire de telle sorte que le runtime Javascript ne perde aucun bit en cours de route. – Pointy
Pour une portabilité maximale, vous devez considérer que les doubles IEEE-754 peuvent être big-endian ou little-endian. Si vous savez quelle convention est utilisée par l'entrée hexadécimale, une solution côté client utilisant pow() doit être portable. Si vous décidez d'utiliser une approche de type punition, vous devrez d'abord vérifier l'endianness de la plate-forme client pour les doubles. –
@Jim Lewis: J'ai un drapeau qui me dit gros ou petit boutiste. – Nosredna