Debug build:
```
CREATE TABLE table_float__fuzz_44 (`f` Decimal(18, 3), `u` Int8) ENGINE = MergeTree ORDER BY (f, u);
INSERT INTO table_float VALUES (1.2, 1) (1.3, 2) (1.4, 3) (1.5, 4);
SELECT count() FROM table_float__fuzz_44 WHERE (toUInt64(f) = 1) AND (f >= 1.3) AND (f <= 1.4) AND (u > 0) GROUP BY (toUInt64(f) = 1) AND (f >= 1.3) AND (f <= 100.0001) AND (u > 0);
```

https://s3.amazonaws.com/clickhouse-test-reports/44812/ea04181d11827fd552a86ca4d9c07e1d531e6ca3/fuzzer_astfuzzerdebug/report.html
{
        if (!type.isValueRepresentedByNumber())
            return {};
        
        
        if (checkAndGetDataType<DataTypeNumber<T>>(&type) ||
            checkAndGetDataType<DataTypeEnum<T>>(&type))
            return { .is_monotonic = true, .is_always_monotonic = true };
        
        
        if constexpr (std::is_floating_point_v<T>)
            return { .is_monotonic = true, .is_always_monotonic = true };
        
        bool is_type_float = false;
        if (const auto * low_cardinality = typeid_cast<const DataTypeLowCardinality *>(&type))
            is_type_float = WhichDataType(low_cardinality->getDictionaryType()).isFloat();
        else
            is_type_float = WhichDataType(type).isFloat();
        if (is_type_float)
        {
            if (left.isNull() || right.isNull())
                return {};
            Float64 left_float = left.get<Float64>();
            Float64 right_float = right.get<Float64>();
            if (left_float >= static_cast<Float64>(std::numeric_limits<T>::min())
                && left_float <= static_cast<Float64>(std::numeric_limits<T>::max())
                && right_float >= static_cast<Float64>(std::numeric_limits<T>::min())
                && right_float <= static_cast<Float64>(std::numeric_limits<T>::max()))
                return { .is_monotonic = true };
            return {};