sub method

MathFract sub(
  1. dynamic r
)

Implementation

MathFract sub( dynamic r ){
	if( r is MathFract ){
		if( _mi != r._mi ){
			// this + -r
			return add( r.minus() );
		}
		if( _de == 0 ){
			return this;
		}
		if( r._de == 0 ){
			return r;
		}
		double de = ClipMath.lcm( _de, r._de );
		double nu = _nu * de / _de - r._nu * de / r._de;
		if( nu < 0.0 ){
			return MathFract( _mi ? false : true, -nu, de );
		}
		return MathFract( _mi, nu, de );
	}
	double rr = ClipMath.toDouble(r);
	if( _mi != (rr < 0.0) ){
		// this + -rr
		return add( -rr );
	}
	double t = (rr < 0.0) ? -rr : rr;
	if( t == ClipMath.toInt( t ) ){
		double nu = _nu - t * _de;
		if( nu < 0.0 ){
			return MathFract( _mi ? false : true, -nu, _de );
		}
		return MathFract( _mi, nu, _de );
	}
	return sub( floatToFract( rr ) );
}