diff --git a/HdrHistogram.UnitTests/HistogramTestBase.cs b/HdrHistogram.UnitTests/HistogramTestBase.cs index f07b7d1..0b24c3e 100644 --- a/HdrHistogram.UnitTests/HistogramTestBase.cs +++ b/HdrHistogram.UnitTests/HistogramTestBase.cs @@ -546,6 +546,27 @@ public void GetPercentileAtOrBelowValue_NegativeValue_ReturnsZero() histogram.GetPercentileAtOrBelowValue(long.MinValue).Should().Be(0.0); } + [Fact] + public void SizeOfEquivalentValueRangeDoesNotOverflow() + { + var histogram = Create(long.MaxValue, DefaultSignificantFigures); + + for (int i = 0; i < 8; i++) + { + histogram.RecordValue(1); + } + + histogram.RecordValue((1L << 41) + 1); + + histogram.RecordValue((1L << 50) + 1); + + var p90 = histogram.GetValueAtPercentile(90); + + p90.Should().BeGreaterThan((1L << 41) + 1); + histogram.SizeOfEquivalentValueRange((1L << 41) + 1).Should().Be((1L << 31)); + p90.Should().Be((1L << 41) + (1L << 31) - 1); + } + private void CreateAndAdd(HistogramBase source) { source.RecordValueWithCount(1, 100); diff --git a/HdrHistogram/HistogramBase.cs b/HdrHistogram/HistogramBase.cs index 0e90363..dc83904 100644 --- a/HdrHistogram/HistogramBase.cs +++ b/HdrHistogram/HistogramBase.cs @@ -355,7 +355,7 @@ public long SizeOfEquivalentValueRange(long value) bucketIndex++; } - var distanceToNextValue = 1 << (_unitMagnitude + bucketIndex); + var distanceToNextValue = 1L << (_unitMagnitude + bucketIndex); return distanceToNextValue; }