dotnet/machinelearning · error · ArithmeticException
Not finite unit value
Error message
Not finite unit value
What it means
During SrCnnEntireAnomalyDetector training, the per-unit sensitivity bound is computed as averageTrendPart + |trend| * trendFraction; if the result overflows to positive infinity, an ArithmeticException('Not finite unit value') is thrown. This guards the detector against numerically degenerate inputs where trend magnitudes explode.
Source
Thrown at src/Microsoft.ML.TimeSeries/SrCnnEntireAnomalyDetector.cs:1016
}
else
{
trendFraction = 1.0;
}
Array.Resize(ref _units, _trends.Length);
for (int i = 0; i < _units.Length; ++i)
{
if (closeToZero)
{
_units[i] = _unitForZero;
}
else
{
_units[i] = averageTrendPart + Math.Abs(_trends[i]) * trendFraction;
if (double.IsInfinity(_units[i]))
{
throw new ArithmeticException("Not finite unit value");
}
}
}
}
private void MedianFilter(double[] data, int window, bool needTwoEnd = false)
{
int wLen = window / 2 * 2 + 1;
int tLen = data.Length;
Array.Resize(ref _val, tLen);
Array.Copy(data, _val, tLen);
Array.Resize(ref _trends, tLen);
Array.Copy(data, _trends, tLen);
Array.Resize(ref _curWindow, wLen);
if (tLen < wLen)
return;
View on GitHub (pinned to 7b76e69cf9)
Solutions
- Sanitize the input series: remove or cap extreme outliers and sentinel magnitudes before training.
- Normalize/rescale the time series (e.g. z-score or min-max) so trend values stay within finite ranges.
- Verify data quality: check for double.MaxValue/Infinity-adjacent values with a quick pre-scan of the column.
- If this occurs on legitimately large-but-valid data, reduce the sensitivity/trendFraction or open an issue with a repro for a scale-aware fix.
Example fix
// before
var pipeline = mlContext.Transforms.Conversion...
.Append(mlContext.AnomalyDetection.Trainers.SrCnnEntireAnomalyDetector(...));
// after: cap outliers first
for (int i = 0; i < values.Length; i++)
values[i] = Math.Min(values[i], 1e6); // or drop/interpolate outliers Defensive patterns
Strategy: validation
Validate before calling
bool finite = data.All(v => !double.IsNaN(v) && !double.IsInfinity(v) && Math.Abs(v) < 1e300);
Try / catch
try { model = pipeline.Fit(trainData); }
catch (ArithmeticException ex) when (ex.Message == "Not finite unit value")
{ /* sanitize/rescale inputs and retry */ } Prevention
- Scan and clean training columns for extreme/sentinel magnitudes before fitting.
- Normalize or z-score the series before anomaly detection.
- Validate data quality (min/max/finite checks) as a pipeline pre-step.
When it happens
Trigger: Fitting SrCnnEntireAnomalyDetector (SrCnnEntireModeler) on series whose computed trend values are huge — e.g. data containing extreme outliers or non-NaN-but-enormous magnitudes — causing _units[i] = averageTrendPart + Math.Abs(_trends[i]) * trendFraction to be double.PositiveInfinity.
Common situations: Training on raw data containing sentinel values like 1e308 or sensor glitches; forgetting to clean/scale extreme outliers before anomaly detection; very small datasets where trend estimation amplifies noise.
Understand the failure class
Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.
Related errors
- Not a RowToRowMapper.
- MismatchedColumnLengths
- Parameter must not be null, empty, or whitespace
- Value cannot be null. (Parameter 'idColumns')
- Must provide at least 1 ID column
AI-assisted analysis of dotnet/machinelearning@7b76e69cf9 (2026-09-11).
Data as JSON: /api/errors/1e186838ad101654.
Report an issue: GitHub.