public KFraction Add(KFraction b) { BigInteger cm = Denominator * b.Denominator; BigInteger newNum = Numerator * b.Denominator + b.Numerator * Denominator; return(new KFraction(newNum, cm).Reduce()); }
public static bool Numberp(KObject args, Func <KFraction, KFraction, bool> cmp) { int length = KPair.Length(args); if (length < 2) { throw new RuntimeException("at least two arguments"); } else { KFraction first = ToExact(Check((args as KPair).Car)); KObject head = (args as KPair).Cdr; while (head is KPair) { KFraction next = NumbersModule.ToExact(NumbersModule.Check((head as KPair).Car)); if (!cmp(first, next)) { return(false); } first = next; head = (head as KPair).Cdr; } return(true); } }
public override object Do(KObject args, KEnvironment env, Continuation <KObject> cont) { CPara(args, 1); KFraction input = First(args) as KFraction; Check(input); return(new KDouble(input.ToDouble())); }
public override object Do(KObject args, KEnvironment env, Continuation <KObject> cont) { CPara(args, 1); var inex = First(args) as KDouble; Check(inex); return(KFraction.fromDouble(inex.Value)); }
public static KFraction ToExact(KObject obj) { if (obj is KFraction) { return(obj as KFraction); } else { return(KFraction.fromDouble((obj as KDouble).Value)); } }
public bool LessEqual(KFraction b) { return(Numerator * b.Denominator <= b.Numerator * Denominator); }
public bool LessThan(KFraction b) { return(Numerator * b.Denominator < b.Numerator * Denominator); }
public KFraction Divide(KFraction b) { return(Multiply(new KFraction(b.Denominator, b.Numerator))); }
public KFraction Multiply(KFraction b) { return(new KFraction(Numerator * b.Numerator, Denominator * b.Denominator).Reduce()); }