diff --git a/src/ImageSharp/Common/Helpers/TolerantMath.cs b/src/ImageSharp/Common/Helpers/TolerantMath.cs
index b9b3b8ea13..d95aea9de2 100644
--- a/src/ImageSharp/Common/Helpers/TolerantMath.cs
+++ b/src/ImageSharp/Common/Helpers/TolerantMath.cs
@@ -1,12 +1,14 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
+using System;
using System.Runtime.CompilerServices;
namespace SixLabors.ImageSharp
{
///
- /// Implements math operations using tolerant comparison.
+ /// Implements basic math operations using tolerant comparison
+ /// whenever an equality check is needed.
///
internal struct TolerantMath
{
@@ -71,5 +73,29 @@ namespace SixLabors.ImageSharp
///
[MethodImpl(InliningOptions.ShortMethod)]
public bool IsLessOrEqual(double a, double b) => b >= a - this.epsilon;
+
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public double Ceiling(double a)
+ {
+ double rem = Math.IEEERemainder(a, 1);
+ if (this.IsZero(rem))
+ {
+ return Math.Round(a);
+ }
+
+ return Math.Ceiling(a);
+ }
+
+ [MethodImpl(InliningOptions.ShortMethod)]
+ public double Floor(double a)
+ {
+ double rem = Math.IEEERemainder(a, 1);
+ if (this.IsZero(rem))
+ {
+ return Math.Round(a);
+ }
+
+ return Math.Floor(a);
+ }
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/Helpers/TolerantMathTests.cs b/tests/ImageSharp.Tests/Helpers/TolerantMathTests.cs
index d488d6491d..6c7a1f2752 100644
--- a/tests/ImageSharp.Tests/Helpers/TolerantMathTests.cs
+++ b/tests/ImageSharp.Tests/Helpers/TolerantMathTests.cs
@@ -126,5 +126,43 @@ namespace SixLabors.ImageSharp.Tests.Helpers
Assert.False(this.tolerantMath.IsGreaterOrEqual(a, b));
Assert.False(this.tolerantMath.IsLessOrEqual(b, a));
}
+
+ [Theory]
+ [InlineData(3.5, 4.0)]
+ [InlineData(3.89, 4.0)]
+ [InlineData(4.09, 4.0)]
+ [InlineData(4.11, 5.0)]
+ [InlineData(0.11, 1)]
+ [InlineData(0.05, 0)]
+ [InlineData(-0.5, 0)]
+ [InlineData(-0.95, -1)]
+ [InlineData(-1.05, -1)]
+ [InlineData(-1.5, -1)]
+ public void Ceiling(double value, double expected)
+ {
+ double actual = this.tolerantMath.Ceiling(value);
+ Assert.Equal(expected, actual);
+ }
+
+ [Theory]
+ [InlineData(1, 1)]
+ [InlineData(0.99, 1)]
+ [InlineData(0.5, 0)]
+ [InlineData(0.01, 0)]
+ [InlineData(-0.09, 0)]
+ [InlineData(-0.11, -1)]
+ [InlineData(-100.11, -101)]
+ [InlineData(-100.09, -100)]
+ public void Floor(double value, double expected)
+ {
+ double plz1 = Math.IEEERemainder(1.1, 1);
+ double plz2 = Math.IEEERemainder(0.9, 1);
+
+ double plz3 = Math.IEEERemainder(-1.1, 1);
+ double plz4 = Math.IEEERemainder(-0.9, 1);
+
+ double actual = this.tolerantMath.Floor(value);
+ Assert.Equal(expected, actual);
+ }
}
}
\ No newline at end of file
diff --git a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
index 86c1a7a259..75ac7450c8 100644
--- a/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
+++ b/tests/ImageSharp.Tests/ImageSharp.Tests.csproj
@@ -1,6 +1,7 @@
- net462;net472;netcoreapp2.1
+
+ netcoreapp2.1
True
latest
full