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 + -
显示快捷键?