using System.Runtime.InteropServices;
using System.Windows;
namespace System {
public static class DoubleUtil {
// Fields
public const double DBL_EPSILON = 2.2204460492503131E-16;
public const float FLT_MIN = 1.175494E-38f;
// Methods
public static bool AreClose(double value1,double value2) {
if(value1 == value2) {
return true;
}
double num = ((Math.Abs(value1) + Math.Abs(value2)) + 10.0) * 2.2204460492503131E-16;
double num2 = value1 - value2;
return ((-num < num2) && (num > num2));
}
public static bool AreClose(Point point1,Point point2) {
return (AreClose(point1.X,point2.X) && AreClose(point1.Y,point2.Y));
}
public static bool GreaterThan(double value1,double value2) {
return ((value1 > value2) && !AreClose(value1,value2));
}
public static bool GreaterThanOrClose(double value1,double value2) {
if(value1 <= value2) {
return AreClose(value1,value2);
}
return true;
}
public static bool IsNaN(double value) {
NanUnion union = new NanUnion
{
DoubleValue = value
};
ulong num = union.UintValue & 18442240474082181120L;
ulong num2 = union.UintValue & ((ulong)4503599627370495L);
if((num != 9218868437227405312L) && (num != 18442240474082181120L)) {
return false;
}
return (num2 != 0L);
}
public static bool IsOne(double value) {
return (Math.Abs((double)(value - 1.0)) < 2.2204460492503131E-15);
}
public static bool LessThan(double value1,double value2) {
return ((value1 < value2) && !AreClose(value1,value2));
}
public static bool LessThanOrClose(double value1,double value2) {
if(value1 >= value2) {
return AreClose(value1,value2);
}
return true;
}
// Nested Types
[StructLayout(LayoutKind.Explicit)]
private struct NanUnion {
// Fields
[FieldOffset(0)]
public double DoubleValue;
[FieldOffset(0)]
public ulong UintValue;
}
}
}