Browse Source

Return hack with double.Epsilon

pull/4096/head
Rustam Sayfutdinov 6 years ago
parent
commit
c73e777ed2
  1. 1
      src/Avalonia.Base/Properties/AssemblyInfo.cs
  2. 2
      src/Avalonia.Base/Utilities/MathUtilities.cs
  3. 3
      src/Avalonia.Controls/Slider.cs
  4. 29
      tests/Avalonia.Base.UnitTests/Utilities/MathUtilitiesTests.cs

1
src/Avalonia.Base/Properties/AssemblyInfo.cs

@ -8,4 +8,3 @@ using Avalonia.Metadata;
[assembly: InternalsVisibleTo("Avalonia.Base.UnitTests")]
[assembly: InternalsVisibleTo("Avalonia.UnitTests")]
[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2")]
[assembly: InternalsVisibleTo("Avalonia.Controls")]

2
src/Avalonia.Base/Utilities/MathUtilities.cs

@ -9,7 +9,7 @@ namespace Avalonia.Utilities
public static class MathUtilities
{
// smallest such that 1.0+DoubleEpsilon != 1.0
internal static readonly double DoubleEpsilon = 2.2204460492503131e-016;
private const double DoubleEpsilon = 2.2204460492503131e-016;
/// <summary>
/// AreClose - Returns whether or not two doubles are "close". That is, whether or

3
src/Avalonia.Controls/Slider.cs

@ -193,7 +193,8 @@ namespace Avalonia.Controls
var orient = Orientation == Orientation.Horizontal;
var pointDen = orient ? _track.Bounds.Width : _track.Bounds.Height;
pointDen += MathUtilities.DoubleEpsilon; // Just add epsilon to avoid divide by zero exceptions.
// Just add epsilon to avoid NaN in case 0/0
pointDen += double.Epsilon;
var pointNum = orient ? x.Position.X : x.Position.Y;
var logicalPos = MathUtilities.Clamp(pointNum / pointDen, 0.0d, 1.0d);

29
tests/Avalonia.Base.UnitTests/Utilities/MathUtilitiesTests.cs

@ -1,3 +1,4 @@
using System;
using Avalonia.Utilities;
using Xunit;
@ -18,6 +19,7 @@ namespace Avalonia.Base.UnitTests.Utilities
var actual = MathUtilities.AreClose(x, y);
Assert.True(actual);
Assert.Equal(x, Math.Round(y, 14));
}
[Fact]
@ -32,6 +34,7 @@ namespace Avalonia.Base.UnitTests.Utilities
var actual = MathUtilities.IsOne(x);
Assert.True(actual);
Assert.Equal(1.0, Math.Round(x, 15));
}
[Fact]
@ -46,6 +49,32 @@ namespace Avalonia.Base.UnitTests.Utilities
var actual = MathUtilities.IsZero(x);
Assert.True(actual);
Assert.Equal(0.0, Math.Round(x, 15));
}
[Fact]
public void Clamp_Input_NaN_Return_NaN()
{
var clamp = MathUtilities.Clamp(double.NaN, 0.0, 1.0);
Assert.True(double.IsNaN(clamp));
}
[Fact]
public void Clamp_Input_NegativeInfinity_Return_Min()
{
const double min = 0.0;
const double max = 1.0;
var actual = MathUtilities.Clamp(double.NegativeInfinity, min, max);
Assert.Equal(min, actual);
}
[Fact]
public void Clamp_Input_PositiveInfinity_Return_Max()
{
const double min = 0.0;
const double max = 1.0;
var actual = MathUtilities.Clamp(double.PositiveInfinity, min, max);
Assert.Equal(max, actual);
}
}
}

Loading…
Cancel
Save