Projekt zawiera implementację szablonowych klas liczbowych reprezentujących różne typy liczb hiperzespolonych:
Complex<T>– liczby zespoloneSplitComplex<T>– liczby podzielnie zespolone (hyperboliczne)Dual<T>– liczby dualneQuaternion<T>– kwaternionyCoquaternion<T>– podzielnie kwaterniony (split-quaternion)Tessarine<T>– tessarynyHyperbolicQuaternion<T>– kwaterniony hiperbolicznePlanarQuaternion<T>– kwaterniony płaskieOctonion<T>– oktanionySplitOctonion<T>– split-oktanionyDualQuaternion<T>– dualne kwaternionyBiquaternion<T>– bikwaternionySplitBiquaternion<T>– split-bi-kwaternionySedenion<T>– sedeniony (16D)Bioctonion<T>– bioctaniony (16D)Trigintaduonion<T>– trigintaduoniony (32D)
- Wszystkie klasy są szablonowe (
template<typename T>) i wspierają typy arytmetyczne:int,short,long,long long,float,double,long double. W przypadku typów całkowitych, liczby zachowują swoje typy, więc w przypadku dzielenia czy odwrotności mogą się zachowywać w sposób nieintuicyjny dla matematyków (np.int / intdajeint, a niefloat). - Hierarchia dziedziczenia oparta jest na klasach pośrednich dla konkretnych wymiarów:
Number2D,Number4D,Number8D,Number16D,NumberNDitp. - Klasa bazowa
NumberND<T, Derived, N>zapewnia:- komponentowy dostęp (
get(i),set(i, val),operator[]) - iteratory (
begin,end,rbegin,rend,cbegin,crbegin) - wsparcie dla operacji z innymi liczbami i ze skalarem:
+,-,*,/,+=,-=,*=,/= - operacje algebraiczne:
negate(),conjugate(),inverse(),norm() equals(),assign(),size(),data()itp.- konwersję i inicjalizację z tablic, list inicjalizacyjnych, argumentów wariadycznych
- komponentowy dostęp (
- Dla każdej klasy dostępne są metody specyficzne, np.:
getReal(),getImaginary(),getHyperbolic(), dla reprezentacji składowych- reprezentacje w postaci trygonometrycznej dla
Complex rotate(...)iapply(...)dlaDualQuaternionfrom2x4D(),from4x2D()dla tworzenia z mniejszych obiektów
- Możliwe jest tworzenie liczb z części zespolonych (
Complex,SplitComplex) lub mniejszych klas jako komponenty większych
Dla każdej klasy liczbowej zdefiniowano kompletny zestaw testów jednostkowych, oparty na GoogleTest i GoogleMock:
- Mocki klas bazowych:
MockNumberND<T, N>,MockNumber2D,MockNumber4D,MockNumber8Ddo testowania zachowania i delegowania - Testy szablonowe dla wszystkich kombinacji typów i wymiarów:
- konstrukcja (domyślna, kopiująca, przenosząca, z tablicy, wariadyczna)
- arytmetyka:
+,-,*,/,+=,-=,*=,/= - porównania:
==,!=,equals(...), również ze skalarem - działania algebraiczne:
conjugate(),norm(),inverse(),negate() - poprawność iteratorów i dostęp do komponentów (
get,operator[]) - strumieniowanie (
operator<<,operator>>), z obsługą błędów formatu
- Przykładowe testy dla cech specyficznych:
DualQuaternion: rotacje i przekształceniaSplitComplex,Coquaternion: liczby z zerową normą, mnożenie nieprzemienne, elementy dzielące zeroOctonion,Sedenion,Trigintaduonion: testy nieprzemienności, niełączności, antykomutatywności
- Testy zasad algebry:
- przemienność, łączność (gdzie obowiązuje), element neutralny, odwrotność, rozdzielność
- rozkłady sprzężenia, iloczyn z odwrotnością, normy kwadratowe
Testy są pogrupowane wg klas i typów (TemplateNDTest, FloatNDTest, Template16DTest, TypedMockNumberND itd.), co umożliwia łatwe rozszerzanie i skalowanie w przyszłości.