mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-19 14:11:58 +00:00
try add some numeric limits checks
This commit is contained in:
parent
4e7f8b0935
commit
33704888e5
@ -166,13 +166,32 @@ struct QuantileApproximateWeighted
|
|||||||
if (level > xr)
|
if (level > xr)
|
||||||
yl = yr;
|
yl = yr;
|
||||||
|
|
||||||
UnderlyingType dy = yr - yl;
|
UnderlyingType dy;
|
||||||
auto dx = xr - xl;
|
|
||||||
|
if (yr - yl > std::numeric_limits<UnderlyingType>::max())
|
||||||
|
dy = std::numeric_limits<UnderlyingType>::max();
|
||||||
|
else if (yr - yl < std::numeric_limits<UnderlyingType>::min())
|
||||||
|
dy = std::numeric_limits<UnderlyingType>::min();
|
||||||
|
else
|
||||||
|
dy = yr - yl;
|
||||||
|
|
||||||
|
Float64 dx;
|
||||||
|
|
||||||
|
if (xr - xl > std::numeric_limits<Float64>::max())
|
||||||
|
dx = std::numeric_limits<Float64>::max();
|
||||||
|
else if (xr - xl < std::numeric_limits<Float64>::min())
|
||||||
|
dx = std::numeric_limits<Float64>::min();
|
||||||
|
else
|
||||||
|
dx = xr - xl;
|
||||||
|
|
||||||
dx = dx == 0 ? 1 : dx;
|
dx = dx == 0 ? 1 : dx;
|
||||||
UnderlyingType dydx = dy / dx;
|
|
||||||
|
|
||||||
g = yl + dydx * (level - xl);
|
if ((yl + (dy / dx) * (level - xl)) > std::numeric_limits<UnderlyingType>::max())
|
||||||
|
g = std::numeric_limits<UnderlyingType>::max();
|
||||||
|
else if (yl + (dy / dx) * (level - xl) < std::numeric_limits<UnderlyingType>::min())
|
||||||
|
g = std::numeric_limits<UnderlyingType>::min();
|
||||||
|
else
|
||||||
|
g = yl + (dy / dx) * (level - xl);
|
||||||
|
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
@ -269,14 +288,32 @@ struct QuantileApproximateWeighted
|
|||||||
if (level > xr)
|
if (level > xr)
|
||||||
yl = yr;
|
yl = yr;
|
||||||
|
|
||||||
|
UnderlyingType dy;
|
||||||
|
|
||||||
UnderlyingType dy = yr - yl;
|
if (yr - yl > std::numeric_limits<UnderlyingType>::max())
|
||||||
auto dx = xr - xl;
|
dy = std::numeric_limits<UnderlyingType>::max();
|
||||||
|
else if (yr - yl < std::numeric_limits<UnderlyingType>::min())
|
||||||
|
dy = std::numeric_limits<UnderlyingType>::min();
|
||||||
|
else
|
||||||
|
dy = yr - yl;
|
||||||
|
|
||||||
|
Float64 dx;
|
||||||
|
|
||||||
|
if (xr - xl > std::numeric_limits<Float64>::max())
|
||||||
|
dx = std::numeric_limits<Float64>::max();
|
||||||
|
else if (xr - xl < std::numeric_limits<Float64>::min())
|
||||||
|
dx = std::numeric_limits<Float64>::min();
|
||||||
|
else
|
||||||
|
dx = xr - xl;
|
||||||
|
|
||||||
dx = dx == 0 ? 1 : dx;
|
dx = dx == 0 ? 1 : dx;
|
||||||
UnderlyingType dydx = dy / dx;
|
|
||||||
|
|
||||||
g = yl + dydx * (level - xl);
|
if ((yl + (dy / dx) * (level - xl)) > std::numeric_limits<UnderlyingType>::max())
|
||||||
|
g = std::numeric_limits<UnderlyingType>::max();
|
||||||
|
else if ((yl + (dy / dx) * (level - xl)) < std::numeric_limits<UnderlyingType>::min())
|
||||||
|
g = std::numeric_limits<UnderlyingType>::min();
|
||||||
|
else
|
||||||
|
g = yl + (dy / dx) * (level - xl);
|
||||||
|
|
||||||
result[indices[level_index]] = g;
|
result[indices[level_index]] = g;
|
||||||
++level_index;
|
++level_index;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
10 [1,1,1,1,10,10,10,10,100,100,100]
|
10 [1,1,1,1,10,10,10,10,100,100,100]
|
||||||
10 [1,1,2,4,7,10,10,10,10,100,100]
|
10 [1,1,2,4,7,10,35,61,87,100,100]
|
||||||
100 100
|
100 100
|
||||||
61 61
|
61 61
|
||||||
|
@ -15,10 +15,10 @@ quantileApproximateWeighted
|
|||||||
-25.5 -8.49999999 -5.1 Decimal(38, 8)
|
-25.5 -8.49999999 -5.1 Decimal(38, 8)
|
||||||
0 0 0
|
0 0 0
|
||||||
9.7 3.23333333 1.94
|
9.7 3.23333333 1.94
|
||||||
19.8999 6.63333332 3.97999999
|
19.9 6.63333332 3.98
|
||||||
30.0999 10.03333333 6.01999999
|
30.1 10.03333333 6.02
|
||||||
40.2999 13.43333332 8.05999999
|
40.3 13.43333332 8.06
|
||||||
50 16.66666666 10
|
50 16.66666666 10
|
||||||
[-50,-40.4,-30.3,-20.2,-10.1,0,10.0999,20.1999,30.2999,40.3999,50]
|
[-50,-40.4,-30.3,-20.2,-10.1,0,10.1,20.2,30.3,40.4,50]
|
||||||
[-16.66666666,-13.46666666,-10.09999999,-6.73333332,-3.36666666,0,3.36666666,6.73333332,10.09999999,13.46666666,16.66666666]
|
[-16.66666666,-13.46666666,-10.09999999,-6.73333332,-3.36666666,0,3.36666666,6.73333332,10.09999999,13.46666666,16.66666666]
|
||||||
[-10,-8.08,-6.06,-4.04,-2.02,0,2.01999999,4.03999999,6.05999999,8.07999999,10]
|
[-10,-8.08,-6.06,-4.04,-2.02,0,2.02,4.04,6.06,8.08,10]
|
||||||
|
Loading…
Reference in New Issue
Block a user