package rpn.doubles;

import real.Formats;
import rpn.basic.Item;
import rpn.basic.DoubleValue;
import rpn.basic.IntItem;
import rpn.basic.CalcErr;
import rpn.basic.ComplexValue;
import rpn.basic.ErrItem;

import rpn.Calculator;

public class DoubleItem extends Item implements DoubleValue, ComplexValue {
	public double x;
	
	public DoubleItem(Calculator ca, double x) {
		super(ca);
		this.x = x;
	}
	
	public double doubleValue() {
		return(x);
	}
	
	public double[] complexValue() {
		double y[] = new double[2];
		y[0] = x;
		y[1] = 0;
		return(y); 
	}
	
	public Item plus(DoubleItem it) {
		double y = x + ((DoubleItem) it).x;
		return(new DoubleItem(ca, y));
	}
	
	public Item minus(DoubleItem it) {
		double y = x - ((DoubleItem) it).x;
		return(new DoubleItem(ca, y));
	}
	
	public Item times(DoubleItem it) {
		double y = x * ((DoubleItem) it).x;
		return(new DoubleItem(ca, y));
	}
	
	public Item div(DoubleItem it) {
		double a = it.x;
		if (a != 0.0) {
			double y = x / a;
			return(new DoubleItem(ca, y));
		} else {
			return(new ErrItem(ca, this, CalcErr.ZeroDiv));
		}
	}
	
	public Item plus(IntItem it) {
		double y = x + ((IntItem) it).n;
		return(new DoubleItem(ca, y));
	}
	
	public Item minus(IntItem it) {
		double y = x - ((IntItem) it).n;
		return(new DoubleItem(ca, y));
	}
	
	public Item times(IntItem it) {
		double y = x * ((IntItem) it).n;
		return(new DoubleItem(ca, y));
	}
	
	public Item div(IntItem it) {
		double y = x / ((IntItem) it).n;
		return(new DoubleItem(ca, y));
	}
	
	public String toString() {
		if (ca.mode == ca.Fix) {
			return(Formats.toString(x, ca.fix, ca.fix));
		} else {
			return(Formats.toScientific(x, ca.fix));
		}
	}
}

