Посоны,
Мы тут сделали библиотеку для математики с фиксированной запятой на С++. Вот так работает:
const auto x = fixed::make::p<2>(1, 11);
Это число с двумя десятичными знаками после запятой представляющее 1.11
.
const auto y = fixed::make::p<1>(1, 0);
Это число с одним десятичным знаком после запятой, представляющее 1.0
.
const auto z = x + y;
Это сумма двух чисел.
А вот это ошибка компиляции:
fixed::make::p<3, uint8_t>((uint8_t)0, 0);
Компилятор видит, что в uint8_t
нельзя представить три десятичных знака и выдаёт ошибку.
Если сделать операцию которая увеличивает точность результата, например умножение, так что требуемая точность не может быть представлена, то это тоже будет ошибка компиляции.
Во время выполнения, переполнение тоже контролируется, все операции возвращают std::optional
который при переполнении будет пустым.
Библиотека спроектирована так чтобы ни один бит информации ни при каких манипуляциях не терялся бы, либо если бит надо потерять, то это надо сделать явно и число станет неточным, на что тоже есть признак, который можно проверить вызвав fixed::is_accurate(x)
, и если какие-то биты были потеряны, то функция вернёт false
.
Можете посмотреть и покритиковать, всё ли по феншую, может чего-то не хватает или что-то лишнее? Пока что финальная версия на сегодняшний день, но было бы интересно узнать какое-нибудь мнение, или даже полезно. Довольно много строк кода, больше тысячи, но не очень много всего, только четыре операции + две трансформации + утилиты.
Ссылка: https://bitbucket.org/alekseyt/fixed
Более полный пример использования: https://bitbucket.org/alekseyt/fixed/src/master/examples/basic.cpp
Заранее спасибо.