2011-08-05 27 views
7

Obecnie próbuję dowiedzieć się, jak pracować z arbitralnej precyzji liczb w PHP. Więc domyślam się, że moje pierwsze pytanie brzmi: czym dokładnie jest matematyczna precyzja. Próbowałem Googling dla dobrej definicji, ale z jakiegoś powodu nikt nie może umieścić go w dość prostych słów.Arbitralne-Precision Math w PHP

Po drugie, jakie są różnice między bibliotekami BCMath i GMP w PHP? Słyszałem, że API GMP jest "świeże", ale idk. Czy jest lepszy?

I moim ostatnim pytaniem będzie, jaki typ liczb ma BCMath/GMP. Oczywiście zajmuje normalne liczby całkowite w postaci ciągu (np. "5.34"), ale widziałem implementacje, w których funkcje BCMath były używane bezpośrednio z ciągami oktetów reprezentującymi zwykłe liczby całkowite (np. "\ X12 \ x23 \ x45 \ x67"), które ja "Słyszałem, że nazywa się" bigint ", ale znowu Google nic dla mnie nie dało.

+0

Teoretycznie oba pozwalają numery dowolnej długości mają być stosowane, o ile są one wprowadzane do biblioteki jako ciągi. Sprowadza się to do tego, co ma lepsze API dla twoich celów. bc działa wyłącznie z ciągami, podczas gdy gmp może akceptować łańcuchy, ale używa również własnych wewnętrznych reprezentacji. –

+0

Uwaga: do pracy z arbitralną precyzją arytmetyki można użyć biblioteki takiej jak [cegła/matematyka] (https://github.com/brick/math), która automatycznie używa GMP, BCMath, a nawet zwykłego PHP za kulisami , w zależności od dostępności każdego rozszerzenia. W ten sposób nie musisz wybierać pomiędzy GMP a BCMath i mieć przyjemny interfejs OO API do grania. – Benjamin

Odpowiedz

12

czym właściwie jest matematyka precyzyjna? Arytmetyka arytmetyczna dokładności, zwana też "matematyką bignum", wprowadza sposób wykonywania operacji arytmetycznych na liczbach, których liczba cyfr jest ograniczona tylko ilością dostępnej pamięci. Odchodzi to od stałej arytmetycznej stałej arytmetycznej, którą zapewniają procesory/jednostki ALU systemów hosta i gdzie maksymalny rozmiar/precyzja reprezentowanej liczby jest współczynnikiem liczby bitów rejestrów tych procesorów sprzętowych.

Arytmetyka o stałej precyzji jest szybka, wydajna pod względem przechowywania i jest wbudowana/powszechnie dostępna. Ma to jednak zastosowanie do ograniczonych (jeśli tylko czasami "wystarczająco dużych") zakresów liczbowych. Arbitralna arytmetyczna precyzja jest wolniejsza, nieco marnująca pamięć i wymaga specjalistycznych bibliotek, takich jak GMP lub BCMath.

jakie są różnice między bcmath i biblioteki GMP
Różnica najbardziej wystający jest, że GMP działa na [arbitralnej precyzji] całkowitych wartości, przy czym BCMath pozwala [dowolną precyzję] dziesiętny/pływaka podobne wartości.
Ani API jest trudne do nauczenia, ale BCMath może być nieco bardziej intuicyjny (oprócz wspierania wartości float like)

One wybór konkretnej biblioteki na inną jest zwykle napędzany przez zamierzonego stosowania (lub przez dostępność na danej platformie). Dopóki nie uzyskasz dużej ilości aplikacji MP, większość bibliotek będzie pasowała do rachunku i będzie generalnie równoważna (oczywiście w swojej klasie, tj. Unikaj biblioteki tylko dla liczb całkowitych, jeśli potrzebujesz liczb zmiennoprzecinkowych).

jaki typ numerów ma BCMath/GMP? Podobnie jak w przypadku większości arbitralnych precyzyjnych pakietów matematycznych, te dwie biblioteki używają łańcuchów dla swoich API, tj. Reprezentują ich wartości liczbowe wejściowe i wyjściowe.
Wewnętrznie ... Niektóre pakiety, takie jak GMP, mają własną reprezentację liczb. Specyfika takich struktur jest zazwyczaj kompromisem pomiędzy minimalizowaniem wymagań dotyczących pamięci masowej i umożliwieniem szybkich obliczeń (w tym "serializacji/deserializacji" takich struktur do/z plików tekstowych).
W tym przykładzie podany jest "\x12\x23\x45\x67", znany jako BCD, tj. Kod binarny. Dziesiętny. Pozwala na zapisanie 2 cyfr dziesiętnych na bajt i jest czasem używany przez arytmetyczne biblioteki arbitralne.

+0

Dzięki za odpowiedź! Mam tylko dwie rzeczy do wyjaśnienia. Czy istnieje powód, by używać BCD zamiast zwykłych liczb całkowitych? I czy zarówno BCMath, jak i GMP akceptują BCD, a także zwykłe liczby całkowite [/ floats dla BCMath]? – parent5446

+0

Ani BCMath, ani GMP nie akceptują wartości wyrażonych w BCD. Zaletą BCD (w porównaniu z ciągami znaków z jedną cyfrą lub znakiem specjalnym, takim jak kropka lub znak minus itp.) Jest to, że BCD jest bardziej kompaktowy: przechowuje 2-niżej niż 1- cyfry na bajt, pozostając jednocześnie łatwym do przypisania do reprezentacji liczby (konkretna cyfra w liczbie odpowiada dokładnie jednemu i tylko jednemu skubnięciu). Wadą BCD jest to, że nie może być reprezentowany w łańcuchach C (z powodu możliwego wystąpienia 2 zer, które mylą się z terminatorem zerowym – mjv

+0

Zazwyczaj _nie chcesz/nie potrzebujesz używać BCD, ale ten format jest czasem wewnętrzny format dowolnych arytmetycznych bibliotek precyzji, a także jest używany do specjalnych zastosowań – mjv