⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float.cpp

📁 计算机组成原理课程设计
💻 CPP
字号:
//用定点数仿真浮点数实现四则运算
#include <math.h>
#include <conio.h>
#include <stdio.h>
//////////////////////////////////////////////////////////////////////////////
int m,n,k;             //m,n分别为前操作数和后操作数右移的位数
//////////////////////////////////////////////////////////////////////////////
void main()
{
 float x,y,z;         //x,y为运算操作数  z为运算结果
 long p;              //存放定点运算后的结果
 int flag;          //flag为控制操作转向的
 char act;            //运算符号
 int ADD(int x,int y);
 int SUB(int x,int y);
 long MUL(long x,long y);
 long DIV(long x,long y);
////////////////////////////////////////////////////////////////
 printf("\t\t*************1.运算*****************\n");
 printf("\t\t*************2.退出******************\n\t\t");
 scanf("%d",&flag);
 while(flag==1)             //进行运算
 {
	 printf("\t\t前操作数:x=");
     scanf("%f",&x);
     printf("\t\t请选择要进行的运算(+,-,*,/):");
     scanf("%c",&act);
	 scanf("%c",&act);
	 printf("\t\t后操作数:y=");
	 scanf("%f",&y);
//////////////////////////////////////////////////////////////////////////////////
     m=0;
     n=0;
     if(x>0)
	 {
		while(x<32768)             //预处理 将操作数转换为定点数
		{
			x=x*2;
			m--;
		}
		while(x>=32768)
		{
			x=x/2;
			m++;
		}
	 }
	 else if(x<0)
	 {
		while(x>=-32768)
		{
			x=x*2;
			m--;
		}
		while(x<-32768)
		{
			x=x/2;
			m++;
		}
	 }
	 if(y>0)
	 {
		while(y<32768)
		{
			y=y*2;
			n--;
		}
		while(y>=32768)
		{
			y=y/2;
			n++;
		}
	}
	else if(y<0)
	{
		while(y>=-32768)
		{
			y=y*2;
			n--;
		}
		while(y<-32768)
		{
			y=y/2;
			n++;
		}
	}
	printf("m,n分别为x,y右移的位数,若为负数,即左移的位数\n");
	printf("x,y为移位后的数值\n");
    switch(act)
	{
	case '+': p=ADD(x,y);
             break;
    case '-': p=SUB(x,y);
             break;
    case '*': p=MUL(x,y);
             break;
    case '/': p=DIV(x,y);
             break;
    default : printf("error\n");
		return;
	}
    z=p;                       //z存放用定点数运算后的结果
    while(k>=1)
	{
		z=z*2;
        k--;
	}
	while(k<0)
	{
		z=z/2;
		k++;
	}
    printf("The Results:x%cy=%f\n",act,z);
    printf("\t\t*************1.继续运算*************\n");
    printf("\t\t*************2.退出*******************\n\t\t");
    scanf("%d",&flag);
 }
}
/*********加法***************/
int ADD(int x,int y)
{
  int p;
  printf("\t\tx=%-10d,  y=%-10d\n",x,y);
  printf("\t\tm=%-10d,  n=%-10d\n",m,n);
  while (m>n)                                   //对齐阶码
  {
    y>>=1;               //右移
    n++;
  }
  while (m<n)
  {
    x>>=1;               //左移
    m++;
  }
  p=x+y;
  if(x<0&&y<0)
   {
	  if(p>0)           //若溢出,则将尾数右移
      {
       x>>=1;
       y>>=1;
       m++;
       n++;
       p=x+y;
	  }
   }
  else if(x>0&&y>0)
        {
          if(p<0)     //若溢出,则将尾数左移
           {
             x>>=1;
             y>>=1;
             m++;
             n++;
             p=x+y;
           }
        }
  k=m;
  return p;
}

/*********减法***************/
int SUB(int x,int y)
{
  int p;
  printf("\t\tx=%-10d,  y=%-10d\n",x,y);
  printf("\t\tm=%-10d,  n=%-10d\n",m,n);
  while (m>n)
  {
    y>>=1;
    n++;
  }
  while (m<n)
  {
    x>>=1;
    m++;
  }
  p=x-y;
  if(x<0&&y>0)
   {
	  if(p>0)      //若溢出,则将尾数右移      
      {
       x>>=1;
       y>>=1;
       m++;
       n++;
       p=x-y;
      }
    }
  else if(x>0&&y<0)
        {
          if(p<0)        //若溢出,则将尾数左移
           {
             x>>=1;
             y>>=1;
             m++;
             n++;
             p=x-y;
            }
         }
  k=m;                //k存放阶码
  return p;
}

/*********乘法***************/
long MUL(long x,long y)               //有问题
{
  long p;
  printf("\t\tx=%-10ld,  y=%-10ld\n",x,y);
  printf("\t\tm=%-10d,  n=%-10d\n",m,n);
  p=x*y;
  k=m+n;
  return p;
}

/*********除法***************/
long DIV(long x,long y)
{
  long p;

  while(x<16*y)
  {
    y>>=4;
    n=n+4;
  }
  printf("\t\tx=%-10ld,  y=%-10ld\n",x,y);
  printf("\t\tm=%-10d,  n=%-10d\n",m,n);
  p=x/y;
  k=m-n;
  return p;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -