# fp16

Библиотека для работы с числами половинной точности (half-precision floating-point) в формате IEEE 754-2008. Она предоставляет эффективные функции для конвертации между форматами float16 и float32/float64, а также оптимизированные математические операции для ускоренных вычислений на CPU и GPU. Библиотека особенно полезна в областях машинного обучения, компьютерной графики и высокопроизводительных вычислений, где важна экономия памяти и пропускной способности.

## Особенности

- эффективная конвертация между float16 и float32/float64 с поддержкой аппаратного ускорения;
- оптимизированные математические операции для чисел половинной точности;
- поддержка векторных инструкций (SIMD) для повышения производительности;
- кроссплатформенность (x86, ARM, GPU архитектуры);
- простая интеграция в существующие проекты на C/C++;
- поддержка как программной, так и аппаратной реализации FP16.

## Основные компоненты

Библиотека FP16 предоставляет набор функций для работы с числами половинной точности, включая конвертацию, базовые арифметические операции и специализированные функции для различных вычислительных платформ (подробнее с документацией можно ознакомиться [здесь](https://github.com/Maratyszcza/FP16)).

### Конвертация чисел с плавающей точкой

Основная задача библиотеки — обеспечение эффективного преобразования между форматами с плавающей точкой разной точности. Эти функции реализованы с учетом специфики аппаратных платформ и используют оптимальные алгоритмы для минимизации потерь точности и максимизации производительности.

Основные функции конвертации:

- `fp16_ieee_to_fp32_value()` — преобразование IEEE half-precision в single-precision float;
- `fp16_ieee_from_fp32_value()` — преобразование single-precision float в IEEE half-precision;
- `fp16_alt_to_fp32_value()` и `fp16_alt_from_fp32_value()` — работа с альтернативными форматами half-precision;
- `fp16_to_fp64()` и `fp64_to_fp16()` — конвертация между half-precision и double-precision.

### Пакетная конвертация данных

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

Функции пакетной конвертации:

- `fp16_ieee_to_fp32_buffer()` — преобразование массива half-precision чисел в single-precision;
- `fp16_ieee_from_fp32_buffer()` — преобразование массива single-precision чисел в half-precision;
- `fp16_alt_to_fp32_buffer()` и `fp16_alt_from_fp32_buffer()` — для альтернативных форматов;
- `fp16_to_fp32_strided()` и `fp32_to_fp16_strided()` — конвертация с заданным шагом.

### Арифметические операции

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

Базовые арифметические функции:

- `fp16_add()` — сложение двух чисел half-precision;
- `fp16_sub()` — вычитание чисел half-precision;
- `fp16_mul()` — умножение двух чисел half-precision;
- `fp16_div()` — деление двух чисел half-precision;
- `fp16_neg()` — смена знака числа;
- `fp16_abs()` — абсолютное значение.

### Сравнение и специальные значения

Библиотека предоставляет функции для сравнения чисел половинной точности и работы со специальными значениями, такими как бесконечности и NaN.

Функции сравнения и проверок:

- `fp16_eq()` — проверка на равенство;
- `fp16_lt()` и `fp16_le()` — сравнение "меньше" и "меньше или равно";
- `fp16_gt()` и `fp16_ge()` — сравнение "больше" и "больше или равно";
- `fp16_is_nan()` — проверка на NaN;
- `fp16_is_inf()` — проверка на бесконечность;
- `fp16_is_normal()` — проверка на нормализованное число.

### Оптимизации для различных архитектур

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

Поддерживаемые оптимизации:

- **SIMD инструкции**: SSE, AVX, AVX-512 для x86; NEON для ARM;
- **Аппаратная поддержка FP16**: использование встроенных инструкций процессора, когда они доступны;
- **GPU-ускорение**: интеграция с CUDA и OpenCL для вычислений на графических процессорах;
- **Многопоточность**: поддержка параллельной обработки данных.

### Инструменты разработки и утилиты

Библиотека включает вспомогательные инструменты для разработки и отладки работы с числами половинной точности.

Полезные утилиты:

- `fp16_print()` — форматированный вывод чисел half-precision;
- `fp16_benchmark` — тесты производительности конвертации и операций;
- `fp16_validate` — проверка корректности преобразований;
- Генераторы случайных чисел half-precision.
