Sunday, August 4, 2013

86. FLOATING POINT ADDER IN JAVA

import java.io.*;
import java.util.*;
class FloatingPointAdder
{          int exp;
            Scanner s=new Scanner(System.in);
            float n1,n2;
            String temp1="",temp2="";
            int exp1,exp2;
            String tmp1="",tmp2="";
            char cry='0';    
            char s1='0',s2='0';
            String e1,e2;
            String m1="", m2="";
            int cmn_expo;
            void input()
            {
                        System.out.println("enter 1st no");
                        n1=s.nextFloat();
                        temp1=tobin_Int((int)n1)+"."+tobin_Float(n1-(int)n1);
                        System.out.println(temp1);
                        System.out.println("enter 2nd no");
                        n2=s.nextFloat();
                        temp2=tobin_Int((int)n2)+"."+tobin_Float(n2-(int)n2);
                        System.out.println(temp2);
                        ieeeformat();
            }
            String tobin_Int(int n)
            {
                        String str="";
                        char c[]=new char[100];
                        int i=-1;
                        while(n!=0)
                        {
                                    c[++i]=(char)(n%2);
                                    n=n/2;
                        }
                        for(;i>=0;i--)
                        str+=c[i]-0;
                        return str;
            }
            String tobin_Float(float n)
            {
                        String str="";
                        for(int i=0;i<5 && n!=0;i++)
                        {
                                    n=n*2;
                                    str+=(int)n;
                                    if(n>=1)
                                                n=n-1;
                        }
                        return str;
            }
            void ieeeformat()
                        {
                        if(n1<0)
                                    s1='1';
                        if(n2<0)
                                    s2='1';
                        exp1=temp1.indexOf('.')-1;
                        exp=temp2.indexOf('.')-1;
                        e1=tobin_Int(exp1+127);
                        e2=tobin_Int(exp1+127);
                        for(int i=1;i<temp1.length();i++)
                                    if(temp1.charAt(i)!='.')
                                                m1+=temp1.charAt(i);
                        for(int i=1;i<temp1.length();i++)
                                    if(temp1.charAt(i)!='.')
                                                m2+=temp2.charAt(i);
                        System.out.println("\n IEEE FORMAT\n SIGNEXPONENT MANTISSA");
                        System.out.println(s1+""+e1+""+m1);
                        System.out.println(s2+""+e2+""+m2+"\n");
                        addition();
            }
            void addition()
            {
                        if(exp1>exp2)
                        {
                                    cmn_expo=exp1;
                                    for(int i=0;i<(exp2-exp1);i++)
                                                temp2+='0';

                        }
                        if(exp1<exp2)
                        {
                                    cmn_expo=exp2;
                                    for(int i=0;i<(exp2-exp1);i++)
                                                tmp1+='0';
                        }
                        if(exp1==exp2)
                                    cmn_expo=exp1;
                        tmp1+='1'+m1;
                        tmp2+='1'+m2;
                        addzeros();
                        char a,b;
                        String res="";
                                    for(int i=tmp1.length()-1;i>=0;i--)
                                                {
                                                            a=tmp1.charAt(i);
                                                            b=tmp2.charAt(i);
                                    if (cry=='0')
                                    {
                                    if(a=='0'&&b=='0')
                                    {
                                                cry='0';
                                                res+='0';
                                    }
                                    if((a=='0'&&b=='1')||(a=='1'&&b=='0'))
                                                {
                                                cry='0';
                                                res+='1';
                                                }
                                    if(a=='1'&&b=='1')
                                    {
                                                cry='1';
                                                res+='0';
                                    }
                        }
                        else
                        {
                                    if(a=='0'&&b=='0')
                                    {
                                    cry='0';
                                    res+='1';
                                    }
                        if((a=='0'&&b=='1')||(a=='1'&&b=='0'))
                        {
                                    cry='1';
                                    res+='0';
                        }
                        if(a=='1'&&b=='1')
                        {
                                    cry='1';
                                    res+='1';
                        }
            }
}
            if(cry =='1')
                        res+=cry;
                        int len=res.length();
                        char restmp[]=new char[len];
                        restmp=res.toCharArray();
                        res="";
            for(int i=len-1;i>=0;i--)
                        res+=restmp[i];
                        int i=cmn_expo+((int)cry-48);
                        res=res.substring(0,i+1)+'.'+res.substring(i+1);
                        System.out.println(res);
                        todec(res);
            }
            void addzeros()
            {
            int t1=tmp1.length(),t2=tmp2.length();
                        if(t1>t2)
                                    for(int i=0;i<(t1-t2);i++)
                                                tmp2+='0';
                        if(t1<t2)
                                    for(int i=0;i<(t2-t1);i++)
                                                tmp1+='0';
            }
            void todec(String str)
                        {
                        int i=str.indexOf('.');
                        float ans=0;
                        for(int j=0;j<str.length();j++)
                                    if(str.charAt(j)!='.')
                                    ans+=((int)str.charAt(j)-48)*Math.pow(2,--i);
                                    System.out.println(ans);
                        }
            }
            class FloatingAdder
                        {
                        public static void main(String str[])
                                    {
                                    FloatingPointAdder a=new FloatingPointAdder();
                                    a.input();
                                    }
                        }

/*OUTPUT:
enter 1st no
456
111001000.
enter 2nd no
258
100000010.

IEEE FORMAT
SIGN EXPONENT MANTISSA
01000011111001000
01000011100000010

1011001010.
714.0

*/