function RtoQ(dblDecimal){
/*	Returns the fractional representation of dblDecimal 
	or dblDecimal if conversion is not possible (i.e. 3.5 -> 3 1/2).
*/
    var LIMIT = 32;
    var dblFraction;
    var dblNumerator;
    var intDenominator;
    var intPos;
    var intBase;
    var strBase='';
    
    dblNumerator = 0;
    intDenominator = 2;

    intBase = Math.floor(dblDecimal) 

    if (intBase == 0)
        intPos = 0;
    else if ((intBase >= 1) && (intBase < 10))
        intPos = 1; 
    else if ((intBase >= 10) & (intBase < 100))
        intPos = 2;
    else
        return dblDecimal;

    if (intBase > 0)
    	strBase = intBase + " ";

    dblFraction = dblDecimal.substr(intPos);
   
    while (intDenominator <= LIMIT)
    {        
        if (dblFraction % (1 / intDenominator) == 0)
	{
            dblNumerator = dblFraction * intDenominator;
            break;
        }
            intDenominator = intDenominator * 2;
    }
    
    if (dblNumerator != 0)
        return strBase + dblNumerator + "/" + intDenominator;
    else
        return dblDecimal;

}

function QtoR(q){
/*	Returns the decimal representation of q 
	or q if conversion is not possible (i.e. 3 1/2 -> 3.5) 
*/
	var re = /[^\s]+/g;
	var tokens = q.match(re);
	var num1,num2;	
	if (tokens){		
		if (tokens.length ==1){
			num1 = eval(tokens[0]);
			if (!isNaN(num1))
				return num1;
		} else if (tokens.length ==2) {
			num1 = eval(tokens[0]);num2 = eval(tokens[1]);
			if (!isNaN(num1) && !isNaN(num2))
				return eval(num1 + num2);		
		}
	} 	
	return null;
}