Типы Float32 | Float64 | BFloat16
Если вам нужны точные вычисления, в частности, если вы работаете с финансовыми или бизнес-данными, требующими высокой точности, вам следует рассмотреть использование Decimal.
Числа с плавающей запятой могут приводить к неточным результатам, как показано ниже:
Эквивалентные типы в ClickHouse и в C приведены ниже:
Float32—float.Float64—double.
Типы Float в ClickHouse имеют следующие алиасы:
Float32—FLOAT,REAL,SINGLE.Float64—DOUBLE,DOUBLE PRECISION.
При создании таблиц можно устанавливать числовые параметры для чисел с плавающей точкой (например, FLOAT(12), FLOAT(15, 22), DOUBLE(12), DOUBLE(4, 18)), но ClickHouse игнорирует их.
Использование чисел с плавающей точкой
- Вычисления с числами с плавающей точкой могут привести к ошибке округления.
- Результат вычисления зависит от метода вычисления (типа процессора и архитектуры компьютерной системы).
- Вычисления с плавающей точкой могут привести к таким числам, как бесконечность (
Inf) и "не-число" (NaN). Это следует учитывать при обработке результатов вычислений. - При разборе чисел с плавающей точкой из текста результат может не быть ближайшим машинно-представимым числом.
NaN и Inf
В отличие от стандартного SQL, ClickHouse поддерживает следующие категории чисел с плавающей точкой:
Inf– Бесконечность.
-Inf— Отрицательная бесконечность.
NaN— Не число.
См. правила сортировки NaN в разделе предложение ORDER BY.
Значения NaN в семантике множеств
Стандарт IEEE 754 определяет NaN так, что скалярное сравнение NaN = NaN возвращает false.
ClickHouse следует этому правилу для оператора =.
Однако NaN — это не одно конкретное значение, а любая битовая комбинация, у которой экспонента состоит только из единиц, а
мантисса не равна нулю. Разные операции и разные архитектуры CPU могут порождать значения NaN
с разными знаковыми битами или разным содержимым мантиссы. Например:
0./0.порождаетNaN, у которого на большинстве платформ x86 знаковый бит равен 1.- Литерал
nanпорождаетNaN, у которого знаковый бит равен 0. - После PR #98230 реализация AArch64 NEON для
logвозвращаетNaN, у которого знаковый бит отличается от скалярногоlogиз glibc для отрицательных входных значений.
Хеш-таблицы в ClickHouse сравнивают ключи побайтно, поэтому разные битовые комбинации NaN хешируются в
разные бакеты и рассматриваются как разные значения в операциях с семантикой множеств, включая
DISTINCT, GROUP BY, uniqExact, countDistinct и JOIN по равенству по ключу Float:
Это соответствует IEEE 754 (каждый NaN не равен ни одному другому значению, включая самого себя),
но это может показаться неожиданным. Если вам нужно, чтобы операции с семантикой множества считали все значения NaN равными,
приведите их к каноническому виду в запросе:
Тот же подход применим к ключам DISTINCT, GROUP BY и JOIN.
BFloat16
BFloat16 — это 16-битный тип данных с плавающей точкой с 8-битной экспонентой, знаком и 7-битной мантиссой.
Он полезен для приложений машинного обучения и искусственного интеллекта.
ClickHouse поддерживает преобразования между Float32 и BFloat16, которые
могут быть выполнены с использованием функций toFloat32() или toBFloat16.
Большинство других операций не поддерживаются.