function Triangular() {
	var a;
	var b;
	var c;
	if ( !(this instanceof Triangular) ) {
		if ( arguments.length === 0 ) {
			return new Triangular();
		}
		return new Triangular( arguments[ 0 ], arguments[ 1 ], arguments[ 2 ] );
	}
	if ( arguments.length ) {
		a = arguments[ 0 ];
		b = arguments[ 1 ];
		c = arguments[ 2 ];
		if ( !isNumber( a ) || isnan( a ) ) {
			throw new TypeError( format( 'invalid argument. Minimum support must be a number. Value: `%s`.', a ) );
		}
		if ( !isNumber( b ) || isnan( b ) ) {
			throw new TypeError( format( 'invalid argument. Maximum support must be a number. Value: `%s`.', b ) );
		}
		if ( !isNumber( c ) || isnan( c ) ) {
			throw new TypeError( format( 'invalid argument. Mode must be a number. Value: `%s`.', c ) );
		}
		if ( !( a <= c && c <= b ) ) {
			throw new RangeError( format( 'invalid arguments. Parameters must satisfy the following condition: %s. a: `%f`. b: `%f`. c: `%f`.', 'a <= c <= b', a, b, c ) );
		}
	} else {
		a = 0.0;
		b = 1.0;
		c = 0.5;
	}
	defineProperty( this, 'a', {
		'configurable': false,
		'enumerable': true,
		'get': function get() {
			return a;
		},
		'set': function set( value ) {
			if ( !isNumber( value ) || isnan( value ) ) {
				throw new TypeError( format( 'invalid assignment. Must be a number. Value: `%s`.', value ) );
			}
			if ( value > b || value > c ) {
				throw new RangeError( format( 'invalid assignment. Must be less than or equal to both the maximum support and the mode. Value: `%f`.', value ) );
			}
			a = value;
		}
	});
	defineProperty( this, 'b', {
		'configurable': false,
		'enumerable': true,
		'get': function get() {
			return b;
		},
		'set': function set( value ) {
			if ( !isNumber( value ) || isnan( value ) ) {
				throw new TypeError( format( 'invalid assignment. Must be a number. Value: `%s`.', value ) );
			}
			if ( a > value || c > value ) {
				throw new RangeError( format( 'invalid assignment. Must be greater than or equal to both the minimum support and the mode. Value: `%f`.', value ) );
			}
			b = value;
		}
	});
	defineProperty( this, 'c', {
		'configurable': false,
		'enumerable': true,
		'get': function get() {
			return c;
		},
		'set': function set( value ) {
			if ( !isNumber( value ) || isnan( value ) ) {
				throw new TypeError( format( 'invalid assignment. Must be a number. Value: `%s`.', value ) );
			}
			if ( a > value || b < value ) {
				throw new RangeError( format( 'invalid assignment. Must be greater than or equal to the minimum support and less than or equal to the maximum support. Value: `%f`.', value ) );
			}
			c = value;
		}
	});
	return this;
}
Triangular distribution constructor.

@constructor
@param {number} [a=0.0] - minimum support
@param {number} [b=1.0] - maximum support
@param {number} [c=0.5] - mode
@throws {TypeError} `a` must be a number
@throws {TypeError} `b` must be a number
@throws {TypeError} `c` must be a number
@throws {RangeError} `a` must be less than or equal to `b` and `c`
@throws {RangeError} `b` must be greater than or equal to `a` and `b`
@throws {RangeError} `c` must be greater than or equal to `a` and smaller than or equal to `b`
@returns {Triangular} distribution instance

@example
var triangular = new Triangular( 0.0, 1.0, 0.25 );

var y = triangular.cdf( 0.8 );
// returns ~0.947

var mu = triangular.mean;
// returns ~0.417