| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 |
- using System;
- [Serializable]
- public struct VFactor
- {
- public long nom; //分子
- public long den; //分母
- [NonSerialized]
- public static VFactor zero = new VFactor(0L, 1L);
- [NonSerialized]
- public static VFactor one = new VFactor(1L, 1L);
- [NonSerialized]
- public static VFactor pi = new VFactor(31416L, 10000L);
- [NonSerialized]
- public static VFactor twoPi = new VFactor(62832L, 10000L);
- private static long mask_ = 9223372036854775807L;
- private static long upper_ = 16777215L;
- public int roundInt
- {
- get
- {
- return (int)IntMath.Divide(this.nom, this.den);
- }
- }
- public int integer
- {
- get
- {
- return (int)(this.nom / this.den);
- }
- }
- public float single
- {
- get
- {
- double num = (double)this.nom / (double)this.den;
- return (float)num;
- }
- }
- public bool IsPositive
- {
- get
- {
- /* DebugHelper.Assert(this.den != 0L, "VFactor: denominator is zero !");*/
- if (this.nom == 0L)
- {
- return false;
- }
- bool flag = this.nom > 0L;
- bool flag2 = this.den > 0L;
- return !(flag ^ flag2);
- }
- }
- public bool IsNegative
- {
- get
- {
- /* DebugHelper.Assert(this.den != 0L, "VFactor: denominator is zero !");*/
- if (this.nom == 0L)
- {
- return false;
- }
- bool flag = this.nom > 0L;
- bool flag2 = this.den > 0L;
- return flag ^ flag2;
- }
- }
- public bool IsZero
- {
- get
- {
- return this.nom == 0L;
- }
- }
- public VFactor Inverse
- {
- get
- {
- return new VFactor(this.den, this.nom);
- }
- }
- public VFactor(long n, long d)
- {
- this.nom = n;
- this.den = d;
- }
- public override bool Equals(object obj)
- {
- return obj != null && base.GetType() == obj.GetType() && this == (VFactor)obj;
- }
- public override int GetHashCode()
- {
- return base.GetHashCode();
- }
- public override string ToString()
- {
- return this.single.ToString();
- }
- public void strip()
- {
- while ((this.nom & VFactor.mask_) > VFactor.upper_ && (this.den & VFactor.mask_) > VFactor.upper_)
- {
- this.nom >>= 1;
- this.den >>= 1;
- }
- }
- public static bool operator <(VFactor a, VFactor b)
- {
- long num = a.nom * b.den;
- long num2 = b.nom * a.den;
- bool flag = b.den > 0L ^ a.den > 0L;
- return (!flag) ? (num < num2) : (num > num2);
- }
- public static bool operator >(VFactor a, VFactor b)
- {
- long num = a.nom * b.den;
- long num2 = b.nom * a.den;
- bool flag = b.den > 0L ^ a.den > 0L;
- return (!flag) ? (num > num2) : (num < num2);
- }
- public static bool operator <=(VFactor a, VFactor b)
- {
- long num = a.nom * b.den;
- long num2 = b.nom * a.den;
- bool flag = b.den > 0L ^ a.den > 0L;
- return (!flag) ? (num <= num2) : (num >= num2);
- }
- public static bool operator >=(VFactor a, VFactor b)
- {
- long num = a.nom * b.den;
- long num2 = b.nom * a.den;
- bool flag = b.den > 0L ^ a.den > 0L;
- return (!flag) ? (num >= num2) : (num <= num2);
- }
- public static bool operator ==(VFactor a, VFactor b)
- {
- return a.nom * b.den == b.nom * a.den;
- }
- public static bool operator !=(VFactor a, VFactor b)
- {
- return a.nom * b.den != b.nom * a.den;
- }
- public static bool operator <(VFactor a, long b)
- {
- long num = a.nom;
- long num2 = b * a.den;
- return (a.den <= 0L) ? (num > num2) : (num < num2);
- }
- public static bool operator >(VFactor a, long b)
- {
- long num = a.nom;
- long num2 = b * a.den;
- return (a.den <= 0L) ? (num < num2) : (num > num2);
- }
- public static bool operator <=(VFactor a, long b)
- {
- long num = a.nom;
- long num2 = b * a.den;
- return (a.den <= 0L) ? (num >= num2) : (num <= num2);
- }
- public static bool operator >=(VFactor a, long b)
- {
- long num = a.nom;
- long num2 = b * a.den;
- return (a.den <= 0L) ? (num <= num2) : (num >= num2);
- }
- public static bool operator ==(VFactor a, long b)
- {
- return a.nom == b * a.den;
- }
- public static bool operator !=(VFactor a, long b)
- {
- return a.nom != b * a.den;
- }
- public static VFactor operator +(VFactor a, VFactor b)
- {
- return new VFactor
- {
- nom = a.nom * b.den + b.nom * a.den,
- den = a.den * b.den
- };
- }
- public static VFactor operator +(VFactor a, long b)
- {
- a.nom += b * a.den;
- return a;
- }
- public static VFactor operator -(VFactor a, VFactor b)
- {
- return new VFactor
- {
- nom = a.nom * b.den - b.nom * a.den,
- den = a.den * b.den
- };
- }
- public static VFactor operator -(VFactor a, long b)
- {
- a.nom -= b * a.den;
- return a;
- }
- public static VFactor operator *(VFactor a, long b)
- {
- a.nom *= b;
- return a;
- }
- public static VFactor operator /(VFactor a, long b)
- {
- a.den *= b;
- return a;
- }
- public static VInt3 operator *(VInt3 v, VFactor f)
- {
- return IntMath.Divide(v, f.nom, f.den);
- }
- public static VInt2 operator *(VInt2 v, VFactor f)
- {
- return IntMath.Divide(v, f.nom, f.den);
- }
- public static VInt3 operator /(VInt3 v, VFactor f)
- {
- return IntMath.Divide(v, f.den, f.nom);
- }
- public static VInt2 operator /(VInt2 v, VFactor f)
- {
- return IntMath.Divide(v, f.den, f.nom);
- }
- public static int operator *(int i, VFactor f)
- {
- return (int)IntMath.Divide((long)i * f.nom, f.den);
- }
- public static VFactor operator -(VFactor a)
- {
- a.nom = -a.nom;
- return a;
- }
- }
|