Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

s21_decimal

Учебная реализация десятичного типа с фиксированной точностью, вдохновлённая типом decimal128. Проект покрывает базовые арифметические операции, сравнение и преобразования между типами.

Содержание

Особенности

  • Базовые арифметические операции: 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         # регистрация всех кейсов

Интерфейс s21_decimal

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.

Развивайте проект дальше: добавляйте новые режимы округления, поддержку большего масштаба или интеграцию с внешними системами чисел с фиксированной точностью.

About

Fixed-point decimal type in C11, modelled on decimal128 — arithmetic, comparison, rounding, and conversions to and from int and float.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages