2009-02-03 18 views
7

Czy istnieje sposób na przedstawienie liczby z większą niż 53-bitową precyzją w JavaScript? Innymi słowy, czy istnieje sposób przedstawienia 64-bitowej liczby dokładnej?JavaScript 64-bitowa precyzja numeryczna

Próbuję zaimplementować pewną logikę, w której każdy bit numeru 64-bitowego reprezentuje coś. Tracę dolne znaczące bity, gdy próbuję ustawić bity wyższe niż 2^53.

Math.pow(2,53) + Math.pow(2,0) == Math.pow(2,53) 

Czy istnieje sposób wdrożenia niestandardowej biblioteki lub czegoś, aby to osiągnąć?

+0

Jakiś szczególny powód, dla którego nie można podzielić go na dwie zmienne lub zamiast tego użyć łańcucha lub tablicy? – some

+0

Podział na 2 zmienne to rozwiązanie, które teraz widzę. łańcuch i tablica wydają się być nieefektywne, ponieważ używałbym tylko kilku z 64 bitów. Dzięki. –

Odpowiedz

0

Zespół GWT dodał długą obsługę emulacji, więc java longs naprawdę trzyma 64 bity. Czy chcesz 64-bitowe zmienne lub liczby całkowite?

+0

liczby całkowite. Przyjrzę się realizacji GWT. dzięki. –

0

Po prostu użyłbym tablicy liczb całkowitych lub ciągu.

Liczby w javascript są podwójne, myślę, że w twoim równaniu występuje błąd zaokrąglenia.

+0

Myślę, że tablice i string byłyby tutaj nieefektywną strukturą danych. Ponieważ używałbym tylko kilku z 64 bitów. Obecnie myślę o użyciu 2 typów numerycznych dla 32 wyższych i 32 bitów. Dzięki –

+0

Problem polega na tym, że nie można polegać na podwójnym, aby zachować spójność, jeśli spróbujesz manipulować bitami. JavaScript nie jest stworzony do manipulowania danymi na warstwie bitowej. –

+0

Całkowicie rozumiem. Jestem ekspertem od javascript lub liczb zmiennoprzecinkowych, czy istnieje typ danych w js, który używa arytmetyki punktowej? –

0

Być może powinienem był dodać pewne szczegóły techniczne. Zasadniczo długa emulacja GWT używa krotki dwóch liczb, z których pierwsza trzyma wysokie 32 bity, a druga 32 niskie bity długości 64 bitów.

Biblioteka zawiera metody dodawania rzeczy, takich jak dodanie dwóch "długich" i uzyskanie "długiego" wyniku. W twoim kodzie GWT Java wygląda on jak dwie zwykłe długie - nie trzeba się skrzywić ani uważać na krotkę. Dzięki temu podejściu GWT unika problemu, do którego prawdopodobnie nawiązujesz, mianowicie "longów" upuszczających niższe bity precyzji, co jest nie do przyjęcia w wielu przypadkach.

Podczas gdy pływaki są z definicji nieprecyzyjne/przybliżenia wartości, liczba całkowita jak długa nie jest. GWT zawsze ma 64-bitową długość - matematyka używająca takich longów nigdy nie używa precyzji. Wyjątek stanowi przepełnienie, ale dokładnie pasuje do tego, co występuje w Javie itp., Gdy dodaje się dwie bardzo duże wartości długie, które wymagają więcej niż 64 bitów - np. 2^32-1 + 2^32-1.

Wykonanie tego samego dla liczb zmiennoprzecinkowych będzie wymagało podobnego podejścia. Będziesz potrzebował biblioteki, która używa krotki.

-7

Dlaczego ktoś potrzebuje 64-bitowej precyzji w javascript?

Longs czasami posiadają ID rzeczy w DB, więc ważne jest, aby nie stracić niektórych niższych bitów ... ale liczby zmiennoprzecinkowe są najczęściej używane do obliczeń. Używanie pływaków do utrzymywania monetarnych lub podobnych wartości jest całkowicie błędne. Jeśli naprawdę potrzebujesz 64-bitowej precyzji, zrób matematykę na serwerze, gdzie jest ona szybsza i tak dalej.

+0

Odpowiedź na pytanie z pytaniem nigdy nie jest pomocna, a ponadto JavaScript po stronie serwera staje się coraz bardziej popularny – scotts

+0

Bo może po prostu może pytający robi coś niewłaściwego, ponieważ nie wiedzą, co robią ... –

-1

Tak, 11 bitów jest zarezerwowanych dla wykładnika, tylko 52-bitowa wartość jest również nazywana frakcją. Javascript umożliwia operacje bitowe na liczbach, ale tylko pierwsze 32 bity są używane w tych operacjach zgodnie ze standardową specyfikacją Javascript.

Nie rozumiem jednak wprowadzających w błąd GWT/Java/długich odpowiedzi w JavaScript/podwójne pytanie? JavaScript to nie Java.

1

W tym celu biblioteka Google Closure ma numer goog.math.Long.

+0

Facet, który napisał kod JavaScript ProtoBuf odizolował także bibliotekę Long from the Closure, dzięki czemu można jej używać jako samodzielnego: https://github.com/dcodeIO/Long.js – SomeCallMeTim