Skip to content

Latest commit

 

History

History
65 lines (55 loc) · 3.85 KB

File metadata and controls

65 lines (55 loc) · 3.85 KB

Klasy liczb hiperzespolonych

Projekt zawiera implementację szablonowych klas liczbowych reprezentujących różne typy liczb hiperzespolonych:

  • Complex<T> – liczby zespolone
  • SplitComplex<T> – liczby podzielnie zespolone (hyperboliczne)
  • Dual<T> – liczby dualne
  • Quaternion<T> – kwaterniony
  • Coquaternion<T> – podzielnie kwaterniony (split-quaternion)
  • Tessarine<T> – tessaryny
  • HyperbolicQuaternion<T> – kwaterniony hiperboliczne
  • PlanarQuaternion<T> – kwaterniony płaskie
  • Octonion<T> – oktaniony
  • SplitOctonion<T> – split-oktaniony
  • DualQuaternion<T> – dualne kwaterniony
  • Biquaternion<T> – bikwaterniony
  • SplitBiquaternion<T> – split-bi-kwaterniony
  • Sedenion<T> – sedeniony (16D)
  • Bioctonion<T> – bioctaniony (16D)
  • Trigintaduonion<T> – trigintaduoniony (32D)

Właściwości techniczne

  • 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 / int daje int, a nie float).
  • Hierarchia dziedziczenia oparta jest na klasach pośrednich dla konkretnych wymiarów: Number2D, Number4D, Number8D, Number16D, NumberND itp.
  • 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

Interfejsy i rozszerzenia

  • Dla każdej klasy dostępne są metody specyficzne, np.:
    • getReal(), getImaginary(), getHyperbolic(), dla reprezentacji składowych
    • reprezentacje w postaci trygonometrycznej dla Complex
    • rotate(...) i apply(...) dla DualQuaternion
    • from2x4D(), 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

Testy jednostkowe

Dla każdej klasy liczbowej zdefiniowano kompletny zestaw testów jednostkowych, oparty na GoogleTest i GoogleMock:

  • Mocki klas bazowych: MockNumberND<T, N>, MockNumber2D, MockNumber4D, MockNumber8D do 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łcenia
    • SplitComplex, Coquaternion: liczby z zerową normą, mnożenie nieprzemienne, elementy dzielące zero
    • Octonion, 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.