Napisałem moduł OUX/C+ do obsługi dużych liczb, który znajduje się pod adresem
https://github.com/overcq/oux/blob/master/module/base/math_bignum.cx
Jest to wersja beta.
Do użycia trzeba pobrać całe środowisko OUX/C+: https://github.com/overcq/oux
Zaimplementowałem obsługę dużych liczb zmiennoprzecinkowych z wszystkimi ich wadami niedokładności. Jeśli użyć tylko liczb całkowitych, to obliczenia są przeprowadzane z pełną dokładnością. Natomiast jeśli użyć liczb ułamka dziesiętnego, to wynik jest zapisywany w dostępnej postaci ułamka dwójkowego o pewnej precyzji trochę większej niż ten ułamek.
Liczba jest przechowywana w postaci binarnej i obliczenia też są przeprowadzane na tej postaci, więc szybciej się nie da.
Obecnie dostępne są operacje: dodawania, odejmowania, negacji, mnożenia, dzielenia z modulo.
Wykonuje się na procesorach z rodziny “x86” i “x86_64”. Dla tych procesorów zostało zaimplementowane dodawanie, odejmowanie (i oparta na nim negacja) oraz mnożenie. Ale można oczywiście dopisać kod dla innych procesorów. Dzielenie z modulo jest bez wstawek asemblera w C. Dzielenie można przeprowadzać na dzielniku o dowolnej wielkości.
Tylko jak przetestować poprawność obliczeń na dużych liczbach? I dodatkowo uwzględniając niedokładność liczby zmiennoprzecinkowej.