lambda computing GmbH
tel +49.(0)69.66563134
fax +49.(0)69.66563135


 

 

Implementations

This contains the implementation of the appropriate interfaces for all primitive types (byte,ushort,uint,ulong,sbyte,short,int,long,float,double,decimal).

It is quite a bit of code, but most of it is copy&paste.

// Copyright (c) 2004, Rüdiger Klaehn
// All rights reserved.
//
using System;
 
namespace Lambda.Generic
{
    #region Unsigned Maths
    namespace Arithmetic
    {
        using T = System.Byte;
        public struct ByteMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedByteMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
    }
    namespace Arithmetic
    {
        using T = System.UInt16;
        public struct UShortMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
        public struct CheckedUShortMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    namespace Arithmetic
    {
        using T = System.UInt32;
        public struct UIntMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedUIntMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    namespace Arithmetic
    {
        using T = System.UInt64;
        public struct ULongMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedULongMath : IUnsignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    #endregion
    #region Signed Maths
    namespace Arithmetic
    {
        using T = System.SByte;
        public struct SByteMath : ISignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedSByteMath : ISignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
            public T Negate(T a) { checked { return (T)(-a); }; }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
            public T Invert(T a) { checked { return (T)(One / a); }; }
 
            public T Sqrt(T a) { return (sbyte)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    namespace Arithmetic
    {
        using T = System.Int16;
        public struct ShortMath : ISignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedShortMath : ISignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
            public T Negate(T a) { checked { return (T)(-a); }; }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
            public T Invert(T a) { checked { return (T)(One / a); }; }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public T Sqrt(T a) { return (sbyte)Math.Sqrt(a); }
            public T Sqr(T a) { return checked((T)(a * a)); }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return (T)(a & b); }
            public T Or(T a, T b) { return (T)(a | b); }
            public T Xor(T a, T b) { return (T)(a ^ b); }
            public T Not(T a) { return (T)(~a); }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    namespace Arithmetic
    {
        using T = System.Int32;
        public struct IntMath : ISignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedIntMath : ISignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
            public T Negate(T a) { checked { return (T)(-a); }; }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
            public T Invert(T a) { checked { return (T)(One / a); }; }
 
            public T Sqrt(T a) { return (sbyte)Math.Sqrt(a); }
            public T Sqr(T a) { return checked(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    namespace Arithmetic
    {
        using T = System.Int64;
        public struct LongMath : ISignedMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
        public struct CheckedLongMath : ISignedMath<T>
        {
            public T Add(T a, T b) { checked { return (T)(a + b); } }
            public T Subtract(T a, T b) { checked { return (T)(a - b); } }
            public T Zero { get { return 0; } }
            public T Negate(T a) { checked { return (T)(-a); }; }
 
            public T Multiply(T a, T b) { checked { return (T)(a * b); } }
            public T Divide(T a, T b) { checked { return (T)(a / b); } }
            public T One { get { return 1; } }
            public T Invert(T a) { checked { return (T)(One / a); }; }
 
            public T Sqrt(T a) { return (sbyte)Math.Sqrt(a); }
            public T Sqr(T a) { return checked(a * a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T And(T a, T b) { return a & b; }
            public T Or(T a, T b) { return a | b; }
            public T Xor(T a, T b) { return a ^ b; }
            public T Not(T a) { return ~a; }
 
            public T ConvertFrom(ulong a) { return checked((T)a); }
            public T ConvertFrom(long a) { return checked((T)a); }
            public T ConvertFrom(double a) { return checked((T)a); }
        }
    }
    #endregion
    #region Rational Maths
    namespace Arithmetic
    {
        using T = System.Single;
        public struct FloatMath : IRationalMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt((double)a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return T.Epsilon; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
 
        public struct FuzzyFloatMath<F> : IRationalMath<T>
            where F:IConstant<T>,new()
        {
            private static T epsilon = new F().Value;
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)a * a; }
             
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return epsilon; } }
 
            public int Compare(T a, T b)
            {
                if (a < b - epsilon)
                    return -1;
                else if (a > b + epsilon)
                    return 1;
                else return 0;
            }
            public bool Equals(T a, T b)
            {
                return Math.Abs(a - b) <= Epsilon;
            }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
    }
    namespace Arithmetic
    {
        using T = System.Double;
        public struct DoubleMath : IRationalMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return One; } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
 
        public struct FuzzyDoubleMath<F> : IRationalMath<T>
            where F : IConstant<T>, new()
        {
            private static T epsilon = new F().Value;
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt(a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return epsilon; } }
 
            public int Compare(T a, T b)
            {
                if (a < b - epsilon)
                    return -1;
                else if (a > b + epsilon)
                    return 1;
                else return 0;
            }
            public bool Equals(T a, T b)
            {
                return Math.Abs(a - b) <= Epsilon;
            }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
    }
    namespace Arithmetic
    {
        using T = System.Decimal;
        public struct DecimalMath : IRationalMath<T>
        {
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt((double)a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return new decimal(1, 0, 0, false, 28); } }
 
            public int Compare(T a, T b) { return a.CompareTo(b); }
            public bool Equals(T a, T b) { return a == b; }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
 
        public struct FuzzyDecimalMath<F> : IRationalMath<T>
            where F : IConstant<T>, new()
        {
            private static T epsilon = new F().Value;
            public T Add(T a, T b) { return (T)(a + b); }
            public T Subtract(T a, T b) { return (T)(a - b); }
            public T Zero { get { return 0; } }
            public T Negate(T a) { return (T)(-a); }
 
            public T Multiply(T a, T b) { return (T)(a * b); }
            public T Divide(T a, T b) { return (T)(a / b); }
            public T One { get { return 1; } }
            public T Invert(T a) { return (T)(One / a); }
 
            public T Sqrt(T a) { return (T)Math.Sqrt((double)a); }
            public T Sqr(T a) { return (T)a * a; }
 
            public T Asin(T a) { return (T)Math.Asin((double)a); }
            public T Acos(T a) { return (T)Math.Acos((double)a); }
            public T Atan(T a) { return (T)Math.Atan((double)a); }
            public T Atan2(T a, T b) { return (T)Math.Atan2((double)a, (double)b); }
            public T Sin(T a) { return (T)Math.Sin((double)a); }
            public T Cos(T a) { return (T)Math.Cos((double)a); }
            public T Tan(T a) { return (T)Math.Tan((double)a); }
 
            public T Log(T a) { return (T)Math.Log((double)a); }
            public T Exp(T a) { return (T)Math.Exp((double)a); }
 
            public T MinValue { get { return T.MinValue; } }
            public T MaxValue { get { return T.MaxValue; } }
            public T Epsilon { get { return epsilon; } }
 
            public int Compare(T a, T b)
            {
                if (a < b - epsilon)
                    return -1;
                else if (a > b + epsilon)
                    return 1;
                else return 0;
            }
            public bool Equals(T a, T b)
            {
                return Math.Abs(a - b) <= Epsilon;
            }
            public int GetHashCode(T a) { return a.GetHashCode(); }
 
            public T ConvertFrom(ulong a) { return (T)a; }
            public T ConvertFrom(long a) { return (T)a; }
            public T ConvertFrom(double a) { return (T)a; }
        }
    }
    #endregion
}