Struct Fraction<TEva>
Pure C# unlimited precision fraction.
public struct Fraction<TEva> : IComparable<Fraction<TEva>>, IEquatable<Fraction<TEva>> where TEva : struct, INumber<TEva>
Type Parameters
TEvaEvaluated floating point type (e.g. double, decimal).
- Implements
-
IComparable<Fraction<TEva>>IEquatable<Fraction<TEva>>
- Inherited Members
- Extension Methods
Remarks
A fraction consists of a numerator and denominator using BigInteger.
The fraction may be not packed or not evaluated. However, all fraction numerator and denominator are singular managed and denominator is never negative.
Design mirrors geom::fraction_t<0, EvaType> in CppCore.
Constructors
Fraction()
Initializes a zero fraction (0/0, status=None).
public Fraction()
Fraction(long)
Initializes a fraction with integer value.
public Fraction(long num)
Parameters
numlongThe integer value.
Fraction(long, long)
Initializes a fraction with numerator and denominator.
public Fraction(long num, long den)
Parameters
Fraction(BigInteger)
Initializes a fraction with integer value.
public Fraction(BigInteger num)
Parameters
numBigIntegerThe integer value.
Fraction(BigInteger, BigInteger)
Initializes a fraction with numerator and denominator.
public Fraction(BigInteger num, BigInteger den)
Parameters
numBigIntegerThe numerator.
denBigIntegerThe denominator.
Properties
CeilInt
Gets the ceiling integer value.
public readonly int CeilInt { get; }
Property Value
Denominator
Gets or sets the denominator.
public BigInteger Denominator { readonly get; set; }
Property Value
FloorInt
Gets the floor integer value.
public readonly int FloorInt { get; }
Property Value
IsEvaluated
Gets whether the fraction value has been evaluated.
public readonly bool IsEvaluated { get; }
Property Value
IsFinite
Gets whether the fraction is finite (denominator != 0).
public readonly bool IsFinite { get; }
Property Value
IsNaN
Gets whether the fraction is NaN (0/0).
public readonly bool IsNaN { get; }
Property Value
IsPacked
Gets whether the fraction is packed (reduced to irreducible form).
public readonly bool IsPacked { get; }
Property Value
IsZero
Gets whether the fraction is zero (numerator == 0 and denominator != 0).
public readonly bool IsZero { get; }
Property Value
NaN
NaN fraction (0/0).
public static Fraction<TEva> NaN { get; }
Property Value
- Fraction<TEva>
NegativeInf
Negative infinity fraction (-1/0).
public static Fraction<TEva> NegativeInf { get; }
Property Value
- Fraction<TEva>
Numerator
Gets or sets the numerator.
public BigInteger Numerator { readonly get; set; }
Property Value
One
One fraction (1/1).
public static Fraction<TEva> One { get; }
Property Value
- Fraction<TEva>
PositiveInf
Positive infinity fraction (1/0).
public static Fraction<TEva> PositiveInf { get; }
Property Value
- Fraction<TEva>
RoughValue
Gets the roughly evaluated value. If the data has not been reduced, the return value is not evaluated by the reduced numbers.
public TEva RoughValue { get; }
Property Value
- TEva
Sign
Gets the sign of the fraction (-1, 0, or 1).
public readonly int Sign { get; }
Property Value
Status
Gets the status flags.
public readonly FractionStatus Status { get; }
Property Value
Value
Gets the evaluated value. Computes the value if not yet evaluated.
public TEva Value { get; }
Property Value
- TEva
Zero
Zero fraction (0/1).
public static Fraction<TEva> Zero { get; }
Property Value
- Fraction<TEva>
Methods
Abs()
Gets the absolute value as a new fraction.
public readonly Fraction<TEva> Abs()
Returns
- Fraction<TEva>
CompareTo(Fraction<TEva>)
Compares this fraction with another.
public readonly int CompareTo(Fraction<TEva> other)
Parameters
otherFraction<TEva>The other fraction.
Returns
- int
-1 if less, 0 if equal, 1 if greater.
Equals(Fraction<TEva>)
Indicates whether the current object is equal to another object of the same type.
public readonly bool Equals(Fraction<TEva> other)
Parameters
otherFraction<TEva>An object to compare with this object.
Returns
Equals(object)
Indicates whether this instance and a specified object are equal.
public override readonly bool Equals(object obj)
Parameters
objobjectThe object to compare with the current instance.
Returns
- bool
true if
objand this instance are the same type and represent the same value; otherwise, false.
Evaluate()
Evaluates the value if not already evaluated.
public Fraction<TEva> Evaluate()
Returns
- Fraction<TEva>
This instance for chaining.
GetHashCode()
Returns the hash code for this instance.
public override int GetHashCode()
Returns
- int
A 32-bit signed integer that is the hash code for this instance.
Negate()
Negates this fraction in place.
public Fraction<TEva> Negate()
Returns
- Fraction<TEva>
This instance for chaining.
Pack()
Packs (reduces) the fraction to irreducible form if not already packed.
public Fraction<TEva> Pack()
Returns
- Fraction<TEva>
This instance for chaining.
PerformanceTest(int, int)
Performance test for Fraction (pure C#). Test 1: Accumulative += with Val (bounded, linear growth). Test 2: Bounded arithmetic (converging average).
public static void PerformanceTest(int iterations = 128, int rounds = 16)
Parameters
Reciprocal()
Gets the reciprocal as a new fraction.
public readonly Fraction<TEva> Reciprocal()
Returns
- Fraction<TEva>
SetAbs()
Sets this fraction to its absolute value.
public Fraction<TEva> SetAbs()
Returns
- Fraction<TEva>
This instance for chaining.
SetReciprocal()
Sets this fraction to its reciprocal.
public Fraction<TEva> SetReciprocal()
Returns
- Fraction<TEva>
This instance for chaining.
SetSquare()
Sets this fraction to its square.
public Fraction<TEva> SetSquare()
Returns
- Fraction<TEva>
This instance for chaining.
Simplify(TEva)
Simplifies the fraction to the specified resolution using Stern-Brocot binary search.
public Fraction<TEva> Simplify(TEva resolution)
Parameters
resolutionTEvaThe resolution tolerance.
Returns
- Fraction<TEva>
This instance for chaining.
Square()
Gets the square as a new fraction.
public readonly Fraction<TEva> Square()
Returns
- Fraction<TEva>
Test()
Test function for Fraction.
public static void Test()
ToString()
Returns the fully qualified type name of this instance.
public override readonly string ToString()
Returns
- string
The fully qualified type name.
Val(TEva, TEva)
Creates a fraction by approximating a double value with specified resolution. Uses Stern-Brocot binary search.
public static Fraction<TEva> Val(TEva val, TEva resolution)
Parameters
valTEvaThe double value to approximate.
resolutionTEvaThe resolution tolerance.
Returns
- Fraction<TEva>
The approximated fraction.
Operators
operator +(Fraction<TEva>, Fraction<TEva>)
Addition: fraction + fraction.
public static Fraction<TEva> operator +(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator +(Fraction<TEva>, long)
Addition: fraction + integer.
public static Fraction<TEva> operator +(Fraction<TEva> a, long b)
Parameters
Returns
- Fraction<TEva>
operator +(long, Fraction<TEva>)
Addition: integer + fraction.
public static Fraction<TEva> operator +(long a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator /(Fraction<TEva>, Fraction<TEva>)
Division: fraction / fraction.
public static Fraction<TEva> operator /(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator /(Fraction<TEva>, long)
Division: fraction / integer.
public static Fraction<TEva> operator /(Fraction<TEva> a, long b)
Parameters
Returns
- Fraction<TEva>
operator /(long, Fraction<TEva>)
Division: integer / fraction.
public static Fraction<TEva> operator /(long a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator ==(Fraction<TEva>, Fraction<TEva>)
Equality operator.
public static bool operator ==(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator ==(Fraction<TEva>, long)
Equality with integer.
public static bool operator ==(Fraction<TEva> a, long b)
Parameters
Returns
explicit operator double(Fraction<TEva>)
Explicit conversion to double.
public static explicit operator double(Fraction<TEva> f)
Parameters
fFraction<TEva>
Returns
operator >(Fraction<TEva>, Fraction<TEva>)
Greater than operator.
public static bool operator >(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator >(Fraction<TEva>, long)
Greater than integer.
public static bool operator >(Fraction<TEva> a, long b)
Parameters
Returns
operator >=(Fraction<TEva>, Fraction<TEva>)
Greater than or equal operator.
public static bool operator >=(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator >=(Fraction<TEva>, long)
Greater than or equal to integer.
public static bool operator >=(Fraction<TEva> a, long b)
Parameters
Returns
implicit operator Fraction<TEva>(int)
Implicit conversion from int.
public static implicit operator Fraction<TEva>(int v)
Parameters
vint
Returns
- Fraction<TEva>
implicit operator Fraction<TEva>(long)
Implicit conversion from long.
public static implicit operator Fraction<TEva>(long v)
Parameters
vlong
Returns
- Fraction<TEva>
operator !=(Fraction<TEva>, Fraction<TEva>)
Inequality operator.
public static bool operator !=(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator !=(Fraction<TEva>, long)
Inequality with integer.
public static bool operator !=(Fraction<TEva> a, long b)
Parameters
Returns
operator <(Fraction<TEva>, Fraction<TEva>)
Less than operator.
public static bool operator <(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator <(Fraction<TEva>, long)
Less than integer.
public static bool operator <(Fraction<TEva> a, long b)
Parameters
Returns
operator <=(Fraction<TEva>, Fraction<TEva>)
Less than or equal operator.
public static bool operator <=(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
operator <=(Fraction<TEva>, long)
Less than or equal to integer.
public static bool operator <=(Fraction<TEva> a, long b)
Parameters
Returns
operator *(Fraction<TEva>, Fraction<TEva>)
Multiplication: fraction * fraction.
public static Fraction<TEva> operator *(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator *(Fraction<TEva>, long)
Multiplication: fraction * integer.
public static Fraction<TEva> operator *(Fraction<TEva> a, long b)
Parameters
Returns
- Fraction<TEva>
operator *(long, Fraction<TEva>)
Multiplication: integer * fraction.
public static Fraction<TEva> operator *(long a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator -(Fraction<TEva>, Fraction<TEva>)
Subtraction: fraction - fraction.
public static Fraction<TEva> operator -(Fraction<TEva> a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator -(Fraction<TEva>, long)
Subtraction: fraction - integer.
public static Fraction<TEva> operator -(Fraction<TEva> a, long b)
Parameters
Returns
- Fraction<TEva>
operator -(long, Fraction<TEva>)
Subtraction: integer - fraction.
public static Fraction<TEva> operator -(long a, Fraction<TEva> b)
Parameters
Returns
- Fraction<TEva>
operator -(Fraction<TEva>)
Negation operator.
public static Fraction<TEva> operator -(Fraction<TEva> a)
Parameters
aFraction<TEva>
Returns
- Fraction<TEva>