package language;
public class MyInt extends MyNumber
{
    public MyNumber neg()
    {
        return new MyInt(-val);
    }
    public boolean ne(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return val!=((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return (double)val!=((MyDouble)y).val;
        }
        return false;
    }
    public MyNumber mod(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return new MyInt(val%((MyInt)y).val);
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return new MyDouble(val%((MyDouble)y).val);
        }
        return null;
    }
    public MyNumber tan()
    {
        return new MyDouble(Math.tan((double)val));
    }
    public MyNumber sqrt()
    {
        return new MyDouble(Math.sqrt((double)val));
    }
    public MyNumber sin()
    {
        return new MyDouble(Math.sin((double)val));
    }
    public MyNumber log()
    {
        return new MyDouble(Math.log((double)val));
    }
    public MyNumber exp()
    {
        return new MyDouble(Math.exp((double)val));
    }
    public MyNumber cos()
    {
        return new MyDouble(Math.cos((double)val));
    }
    public MyNumber atan()
    {
        return new MyDouble(Math.atan((double)val));
    }
    public int getInt()
    {
        return val;
    }
    public boolean ge(MyNumber y)
    {
        int nt=y.ntype;
        /*
         if(y.getClass().getName().equals("MyInt")){
         */
         if(nt==2){// MyInt
            return val>=((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){// MyDouble
            return (double)val>=((MyDouble)y).val;
        }
        return false;
   }
    public boolean le(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return val<=((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return (double)val<=((MyDouble)y).val;
        }
        return false;
    }
    public boolean eq(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){// MyInt
            return val==((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){// MyDouble
            return (double)val==((MyDouble)y).val;
        }
        return false;
    }
    public boolean gt(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){ //MyInt
            return val>((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){ //MyDouble
            return (double)val>((MyDouble)y).val;
        }
        return false;
    }
    public boolean lt(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return val<((MyInt)y).val;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return (double)val<((MyDouble)y).val;
        }
        return false;
    }
    public double exp(double x, double y)
    {
        return Math.exp(y*(Math.log(x)));
    }
    public MyNumber exp(MyNumber y)
    {
        int i;
        int xi;
        int nt=y.ntype;
        double xd,yd;
        /*
         if(y.getClass().getName().equals("MyInt")){
         */
         if(nt==2){ // MyInt
            int yy=((MyInt)y).val;
            if(yy==0) return new MyInt(1);
            if(yy>0){
                xi=1;
                for(i=0;i<yy;i++) xi=xi*val;
                return new MyInt(xi);
            }
            if(yy<0){
                xd=1.0;
                for(i=0;i<-yy;i++) xd=xd/val;
                return new MyDouble(xd);
            }
            return null;
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){ //MyDouble
            yd=((MyDouble)y).val;
            if(yd==0.0) new MyInt(1);
            if(val<=0) return null;
            double r=exp((double)val,yd);
            return new MyDouble(r);
        }
        return null;
   }
    public MyNumber div(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){ // MyInt
            return new MyInt(val/((MyInt)y).val);
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){ //MyDouble
            return new MyDouble(((double)val)/((MyDouble)y).val);
        }
        return null;
    }
    public MyInt()
    {
        ntype=2;
    }
    public MyNumber mul(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return new MyInt(val*((MyInt)y).val);
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return new MyDouble((double)val*((MyDouble)y).val);
        }
        return null;
    }
    public MyNumber sub(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==2){
            return new MyInt(val-((MyInt)y).val);
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){
            return new MyDouble((double)val-((MyDouble)y).val);
        }
        return null;
    }
    public MyNumber add(MyNumber y)
    {
        int nt=y.ntype;
        /*
        if(y.getClass().getName().equals("MyInt")){
        */
        if(nt==1){ // MyString
             String x=((MyString)y).val;
             int r=0;
             try{
                r=(new Integer(x)).intValue();
             }
             catch(Exception e){
                return null;
             }
                return new MyInt(val+r);
        }
        if(nt==2){ // MyInt
            int r=val+((MyInt)y).val;
            return new MyInt(r);
        }
        /*
        if(y.getClass().getName().equals("MyDouble")){
        */
        if(nt==3){// MyDouble
            return new MyDouble((double)val+((MyDouble)y).val);
        }
        return null;
    }
    public int val;
    public MyInt(int x)
    {
        val=x;
        ntype=2;
    }
}