mod method

MathFract mod(
  1. dynamic r
)

Implementation

MathFract mod( dynamic r ){
	if( r is MathFract ){
		if( _de == 0 ){
			return this;
		}
		if( r._de == 0 ){
			return MathFract( _mi, r._nu, r._de );
		}
		double de = ClipMath.lcm( _de, r._de );
		double d = r._nu * de / r._de;
		if( d == 0.0 ){
			return MathFract( _mi, _nu, 0 );
		}
		return MathFract(
			_mi,
			ClipMath.fmod( _nu * de / _de, d ),
			de
			);
	}
	double rr = ClipMath.toDouble(r);
	double t = (rr < 0.0) ? -rr : rr;
	if( t == ClipMath.toInt( t ) ){
		if( _de == 0 ){
			return this;
		}
		if( t == 0.0 ){
			return MathFract( _mi, 0, 0 );
		}
		return MathFract(
			_mi,
			ClipMath.fmod( _nu, t * _de ),
			_de
			);
	}
	return mod( floatToFract( rr ) );
}