protected static Ptg calcImProduct( Ptg[] operands )
	{
		if( operands.length < 1 )
		{
			return new PtgErr( PtgErr.ERROR_NULL );
		}

		debugOperands( operands, "IMPRODUCT" );
		Ptg[] ops = PtgCalculator.getAllComponents( operands );
		String[] complexStrings = new String[ops.length];
		for( int i = 0; i < ops.length; i++ )
		{
			complexStrings[i] = StringTool.allTrim( ops[i].getString() );
		}

		Complex[] c = new Complex[complexStrings.length];
		for( int i = 0; i < complexStrings.length; i++ )
		{
			try
			{
				c[i] = imParseComplexNumber( complexStrings[i] );
			}
			catch( Exception e )
			{
				return new PtgErr( PtgErr.ERROR_NUM );
			}
		}

		// basically, linear binomial multiplication over n terms
		// (a + bi)(c + di) = (ac-bd) + (ad+bc)i   for n terms
		for( int i = 1; i < c.length; i++ )
		{
			double a = c[0].real;
			double b = c[0].imaginary;
			c[0].real = a * c[i].real - b * c[i].imaginary;
			c[0].imaginary = a * c[i].imaginary + b * c[i].real;
		}

		// Format Result
		String imSum;
		if( c[0].imaginary > 0 )
		{
			imSum = imGetExcelStr( c[0].real ) + "+" + imGetExcelStr( c[0].imaginary ) + c[0].suffix;
		}
		else
		{
			imSum = imGetExcelStr( c[0].real ) + imGetExcelStr( c[0].imaginary ) + c[0].suffix;
		}

		PtgStr pstr = new PtgStr( imSum );
		log.debug( "Result from IMSPRODUCT= " + pstr.getString() );
		return pstr;
	}