📄 float.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 + -