myfloat.cpp
来自「very good one math about computer orga」· C++ 代码 · 共 186 行
CPP
186 行
#include <cmath>
#include ".\myfloat.h"
MyFloat::MyFloat(void)
{
}
MyFloat::~MyFloat(void)
{
}
int MyFloat::Add(MyFloat data2, MyFloat & dataResult)
{
MyLFloat dataInernal;//存放中间结果
int i;
//求阶差j,按小阶向大阶对齐的原则,小阶的尾数右移i位
if(j>data2.j)
{
i=j-data2.j;
do
{
data2.s=data2.s/10;
i--;
}while(i!=0);
}
else if(j<data2.j)
{
i=data2.j-j;
do{
s=s/10;
i--;
}while(i!=0);
j=data2.j;
}
//尾数相加
dataInernal.s=s+data2.s;
dataInernal.j=j;
if (dataInernal.s>1||dataInernal.s<-1)//尾数大于1,表示定点小数溢出,则小数点左移一位,消除溢出,保持尾数为纯小数(定点小数)
{
dataInernal.s /= 10;
dataInernal.j += 1;
}
int iResult=CheckResult(dataInernal);
dataResult.j=(int)dataInernal.j;
dataResult.s=dataInernal.s;
return iResult;
}
int MyFloat::Sub(MyFloat data2, MyFloat & dataResult)
{
MyLFloat dataInernal;//存放中间结果
int i; //存放要移动的位数
//求阶差j,按小阶向大阶对齐的原则,小阶的尾数右移i位
if(j>data2.j)
{
i=j-data2.j;
do
{
data2.s=data2.s/10;
i--;
}while(i!=0);
}
else if(j<data2.j)
{
i=data2.j-j;
do{
s=s/10;
i--;
}while(i!=0);
j=data2.j;
}
//尾数相减
dataInernal.s=s-data2.s;
dataInernal.j=j;
if (dataInernal.s>=1||dataInernal.s<=-1)//尾数大于1,表示定点小数溢出,则小数点左移一位,消除溢出,保持尾数为纯小数(定点小数)
{
dataInernal.s /= 10;
dataInernal.j += 1;
}
int iResult=CheckResult(dataInernal);
dataResult.j=(int)dataInernal.j;
dataResult.s=dataInernal.s;
return iResult;
}
int MyFloat::Mul(MyFloat data2, MyFloat & dataResult)
{
MyLFloat dataInernal;//存放中间结果
if(s==0||data2.s==0)//乘数与被乘数有一个为零的情况,结果即为零
{
dataResult.s=0;
dataResult.j=0;
return 0;//未溢出
}
dataInernal.j=j+data2.j;
dataInernal.s=s*data2.s;
int iResult=CheckResult(dataInernal);//规格化,并判断溢出
dataResult.j=(int)dataInernal.j;
dataResult.s=dataInernal.s;
return iResult;
}
int MyFloat::Div(MyFloat data2, MyFloat & dataResult)
{
MyLFloat dataInernal;//存放中间结果
if(s==0)//被除数为零结果为零
{
dataResult.s=0;
dataResult.j=0;
return 0;//未溢出
}
else if (data2.s==0)
{
return -3;//-3表示除数为零,为非法数据,不执行任何操作
}
dataInernal.j=j-data2.j;
dataInernal.s=s/data2.s;
int iResult=CheckResult(dataInernal);//规格化,并判断溢出
dataResult.j=(int)dataInernal.j;
dataResult.s=dataInernal.s;
return iResult;
}
int MyFloat::CheckResult(MyLFloat & dataResult)
{
//先规格化浮点数,然后再判断溢出
//函数返回0表示无溢出;返回-1表示下溢;返回1表示上溢;
if(dataResult.s==0)//若尾数为“0”,则置阶码为零0。
{
dataResult.j=0;
return 0;
}
else
{
if (abs(dataResult.s)>=1)
{
while(abs(dataResult.s)>=1) //右规格化
{
dataResult.s /= 10;
dataResult.j++;
}
}
else if (abs(dataResult.s)<0.1)
{
while(abs(dataResult.s)<0.1) //左规格化
{
dataResult.s *= 10;
dataResult.j--;
}
}
if(dataResult.j>32767) //阶码大于32767即为上溢
return 1;
if(dataResult.j<=-32768) //阶码小于-32768即为下溢,置机器零
{
dataResult.s=0;
dataResult.j=0;
return -1;
}
return 0;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?