Учебная реализация десятичного типа с фиксированной точностью, вдохновлённая типом
decimal128. Проект покрывает базовые арифметические операции, сравнение и преобразования между типами.
- Особенности
- Структура каталога
- Интерфейс
s21_decimal - Сборка и запуск
- Тестирование и покрытие
- Ограничения реализации
- Базовые арифметические операции:
add,sub,mul,div+ округления (floor,round,truncate,negate). - Функции сравнения: равенство, неравенство, больше/меньше, включая варианты
>=/<=. - Преобразования:
int↔decimal,float↔decimalс учётом шкалы и знака. - Поддержка масштаба до 28 знаков после запятой, хранение значений в 96-битной мантиссе (
bits[0..2]) и метаданных (bits[3]). - Вспомогательные функции «u96_*» для работы с мантиссой и нормализации шкалы.
- Набор модульных тестов на фреймворке Check, покрывающий арифметику, сравнения, конвертации и вспомогательные утилиты.
src/
├── Makefile # сборка библиотеки, тестов и покрытия
├── s21_decimal.h # публичный заголовок и вспомогательные макросы
├── s21_*.c # реализации операций и утилит
└── tests/ # тесты на Check
├── tests.c # точка входа запуска тестов
├── tests_*.c # группы тестов по тематикам
└── tests.h # регистрация всех кейсов
typedef struct {
int bits[4];
} s21_decimal;bits[0..2]— 96-битная мантисса.bits[3]— служебное поле: знак в бите 31 (S21_SIGN_MASK), шкала в битах 16-23 (S21_SCALE_MASK).- Максимальное значение шкалы (
S21_SCALE_MAX) — 28, что соответствует диапазону денежного типа «копейки/центы».
Для работы доступны функции s21_get_scale/set_scale, s21_get_sign/set_sign, нормализация масштаба (s21_to_common_scale, s21_strip_trailing_zeros), операции с 96-битными числами (u96_add, u96_mul10 и пр.). Это позволяет точнее управлять переполнением и округлением.
gccилиclangс поддержкой C11.make.- Для тестов:
pkg-config,check,subunit,pthread,rt,m. - Для отчётов покрытия:
gcovr.
make # собирает статическую библиотеку s21_decimal.a
make test # собирает тестовый раннер и запускает тесты
make gcov_report# пересобирает с флагами покрытия и генерирует html-отчёт
make clean # удаляет объектные файлы, библиотеку, отчёты- По завершении
make testсоздаётся бинарникtests_runner. - Отчёт покрытия сохраняется в
coverage/index.html.
Каталог tests/ включает тематические группы:
tests_add_sub.c,tests_mul_div.c— арифметика.tests_comparison.c— операции сравнения.tests_rounding.c— округления (floor,round,truncate).tests_negate.c— смена знака.tests_from_*— преобразования к/изintиfloat.tests_utilities_extra.c,tests_div_extra.c— проверка крайних и дополнительных сценариев.
Запуск make test автоматически линкует библиотеку s21_decimal.a с Check и прогоняет все кейсы. При использовании make gcov_report дополнительно собирается HTML-отчёт с покрытиями.
- Максимальная мантисса — 96 бит, при переполнении операции могут возвращать ошибки (см. контракт функций
s21_add/s21_mul/...). - Обработка
floatзависит от точности исходногоы значения; возможны потери точности при конвертации. - Продвинутые режимы округления (Banker's rounding) реализованы только там, где явно требуется заданиями.
- Проект ориентирован на учебные цели и не претендует на промышленную реализацию типа decimal128.
Развивайте проект дальше: добавляйте новые режимы округления, поддержку большего масштаба или интеграцию с внешними системами чисел с фиксированной точностью.