Nie znam dobrej drogi. To na pewno można zrobić w przykry sposób, oto przykład pojedynczej precyzji całkowicie w ciągu JavaScript:
js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0/Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
18.899999618530273
Implementacja produkcja powinna uznać, że większość pól mają wartości magiczne, zazwyczaj realizowane poprzez określenie specjalnej interpretacji przez co byłby największy lub najmniejszy. Więc wykryjmy nieskończoności. Powyższy przykład powinien sprawdzać negatywy. (& 0x80000000)
Aktualizacja: Ok, mam też dla podwójnych. Nie można bezpośrednio rozszerzyć powyższej techniki, ponieważ wewnętrzna reprezentacja JS jest podwójna, a więc z definicji może obsłużyć w najlepszym przypadku łańcuch o długości 52 i nie może w ogóle przejść o więcej niż 32.
OK, aby wykonać dwukrotnie najpierw odetnij jako ciąg niskie 8 cyfr lub 32 bity; przetwarzać je za pomocą oddzielnego obiektu. Następnie:
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>
Zachowałem powyższy przykład, ponieważ pochodzi z PO. Trudniej jest, gdy niskie 32 bity mają wartość. Oto konwersja 0x40725082deadbeef, pełne precyzji double:
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>
Istnieje kilka oczywistych Podwyrażenia można się czynnikiem ale zostawiłem to w ten sposób, dzięki czemu można zobaczyć, jak to odnosi się do wzoru.
Osobiście zacznę od krojenia wartości szesnastkowej za pomocą wyrażenia regularnego w osobnych częściach. Następnie oceniłbym je jako liczby całkowite, a na koniec spróbowałbym zamienić je w zmiennoprzecinkowe. Wygląda to na coś, co będzie trudne, ponieważ będziesz musiał to zrobić tak, że środowisko wykonawcze JavaScript nie straci żadnych bitów po drodze. – Pointy
Dla maksymalnej mobilności, powinieneś wziąć pod uwagę, że debel IEEE-754 może być zarówno big-endian, jak i little-endian. Jeśli wiesz, która konwencja jest używana przez wejście szesnastkowe, rozwiązanie po stronie klienta korzystające z pow() powinno być przenośne. Jeśli zdecydujesz się na zastosowanie pewnego rodzaju metody typowania, typowanie platformy klienta dla debla powinno być najpierw sprawdzone. –
@ Jim Lewis: Mam flagę, która mówi mi o dużym lub małym endianie. – Nosredna