📄 float.c
字号:
/*计算机组成原理大作业*/
/*软件仿真浮点运算*/
/*051110115 李佩佩*/
/*051110113 陆璐*/
/*051110228 曹晶*/
/*包含头文件*/
#include <stdio.h>
#include <string.h>
/* 宏定义 */
#define L 9
#define W 5
#define J 4
#define S 1
/* 函数声明 */
/* 输入输出函数 */
void input( char * );
void output( char *, char *, char, char, char *, char, char * );
/* 加减乘除运算的实现*/
void add( char *, char *, char ); /* 加法 */
void sub( char *, char * ); /* 减法 */
void mul( char *, char * ); /* 乘法 */
void div( char *, char * ); /* 除法 */
/* 将符号与数值分开 */
void divide( char *, char *, char * );
/* 转换类型 */
int change( char * );
char Add( char *, char *, char * );
char D( char *, char *, char * );
/* 规格化 */
char standard( char, char *, char * );
int N = 0;
/*主函数*/
main()
{
char number1[ L + 1 ] = "0";
char number2[ L + 1 ] = "0";
char choice;
printf(" -------------------------------\n");
printf("| 软件仿真浮点运算系统 |\n");
printf(" -------------------------------\n");
printf("| 软件学院051110115 李佩佩 |\n");
printf("| 051110113 陆璐 |\n");
printf("| 051110228 曹晶 |\n");
printf(" -------------------------------\n\n");
printf( "请输入第一个操作数(原码表示):\n\n\n" );
input( number1 );
printf ( "\n请输入第二个操作数(原码表示):\n\n\n" );
input( number2 );
printf("\n -------------------------------------\n");
printf(" 软件仿真浮点运算系统 \n");
printf(" -------------------------------------\n");
printf(" 软件学院 \n");
printf(" -------------------------------------\n");
printf("| 输入选项编号: |\n");
printf("| 1 --------------------- 加 |\n");
printf("| 2 --------------------- 减 |\n");
printf("| 3 --------------------- 乘 |\n");
printf("| 4 --------------------- 除 |\n");
printf("| 5 --------------------- Esc |\n");
printf("|_____________________________________|\n");
printf("?\n");
choice = getche();
if( choice < '1' || choice > '5')
{
printf("\n输入有误,请重新输入:");
choice = getche();
}
switch ( choice )
{
case '1':
add( number1, number2, '+' );
break;
case '2':
sub( number1, number2 );
break;
case '3':
mul( number1, number2 );
break;
case '4':
div( number1, number2 );
break;
case '5':
break;
}
getch();
}
/*输入函数*/
void input( char * number)
{
int i;
int count = 0;
int flag = 0;
do
{
if ( flag == 1 )
printf("\n输入有误,请重新输入: \n");
count = 0;
printf("*,");
for( i = 1; i <= J - 1; i++ )
printf("*");
printf(";*,");
for( i = 1; i <= W - 1; i++ )
printf("*");
printf("\n");
number[count] = getche();
while( count < ( L - 1 ) && ( number[count] == '0' || number[count] == '1' ) )
{
if ( count == 0 )
printf(",");
if ( count == ( J - 1 ) )
printf(";");
if ( count == J )
printf(".");
count++;
number[count] = getche();
}
flag = 1;
}while ( count != ( L - 1 ) );
number[ L ] = '\0';
}
/*输出函数*/
void output( char *number1, char *number2, char operation,
char rJsign, char *rJnum,
char rWsign, char *rWnum )
{
int i = 0;
printf("\n\n运算结果为(用原码表示):\n");
for ( i = 0; i < L; i++ )
{
if ( i == 1 )
printf(",");
if ( i == J )
printf(";");
if ( i == J + 1 )
printf(".");
printf( "%c", number1[i] );
}
printf( " %c ", operation );
for ( i = 0; i < L; i++ )
{
if ( i == 1 )
printf(",");
if ( i == J )
printf(";");
if ( i == J + 1 )
printf(".");
printf( "%c", number2[i] );
}
printf(" = ");
printf("%c,%s;%c.%s", rJsign, rJnum, rWsign, rWnum );
printf("\n按任意键继续...");
}
/*加运算*/
void add( char *number1, char * number2, char choose )
{
char jsign1 = number1[0];
char jnum1[ J ];
char wsign1 = number1[ J ];
char wnum1[ W ];
char jsign2 = number2[ 0 ];
char jnum2[ J ];
char wsign2 = number2[ J ];
char wnum2[ W ];
char rJsign;
char rJnum[ J ];
char rWsign;
char rWnum[ W ];
int n1, n2, count = 1;
char carry;
int k;
divide( jnum1, wnum1, number1 );
divide( jnum2, wnum2, number2 );
n1 = change( jnum1 );
n2 = change( jnum2 );
if ( jsign1 == jsign2 )
{
if ( jsign1 == '0' )
{
if ( n1 == n2 )
{
strcpy( rJnum, jnum1 );
rJsign = jsign1;
}
while ( n1 > n2 )
{
count = ( W - 1 );
while ( count > 0 )
{
wnum2[ count - 1 ] = wnum2[ count - 2 ];
count--;
}
wnum2[ count ] = '0';
n2++;
strcpy( rJnum, jnum1 );
rJsign = jsign1;
}
while ( n1 < n2 )
{
count = ( W - 1 );
while ( count > 0 )
{
wnum1[ count - 1 ] = wnum1[ count - 2 ];
count--;
}
wnum1[ count ] = '0';
n1++;
strcpy( rJnum, jnum2 );
rJsign = jsign2;
}
}
else
{
if ( n1 == n2 )
{
strcpy( rJnum, jnum1 );
rJsign = jsign1;
}
while ( n1 > n2 )
{
count = ( W - 1 );
while ( count > 0 )
{
wnum1[ count - 1 ] = wnum1[ count - 2 ];
count--;
}
wnum1[ count ] = '0';
n1--;
strcpy( rJnum, jnum2 );
rJsign = jsign1;
}
while ( n1 < n2 )
{
count = ( W - 1 );
while ( count > 0 )
{
wnum2[ count - 1 ] = wnum2[ count - 2 ];
count--;
}
wnum2[ count ] = '0';
n2--;
strcpy( rJnum, jnum1 );
rJsign = jsign2;
}
}
}
else
{
if ( jsign1 == '0' && jsign2 == '1' )
{
k = change( jnum1 ) + change( jnum2 );
while( k > 0 )
{
count = ( W - 1 );
while ( count > 1 )
{
wnum2[ count - 1 ] = wnum2[ count - 2 ];
count--;
}
wnum2[ count ] = '0';
k--;
strcpy( rJnum, jnum1 );
rJsign = jsign1;
}
}
else
{
k = change( jnum1 ) + change( jnum2 );
while( k > 0 )
{
count = W;
while ( count > 1 )
{
wnum1[ count - 1 ] = wnum1[ count - 2 ];
count--;
}
wnum1[ count ] = '0';
k--;
strcpy( rJnum, jnum2 );
rJsign = jsign2;
}
}
}
if ( wsign1 == wsign2 )
{
carry = Add( wnum1, wnum2, rWnum );
rWsign = wsign1;
}
else
{
if ( strcmp( wnum1, wnum2 ) > 0 )
{
D( wnum1, wnum2, rWnum );
rWsign = wsign1;
}
else
{
D( wnum2, wnum1, rWnum );
rWsign = wsign2;
}
}
for ( count = 0; count < ( J - 1 ); count++ )
{
if ( rJnum[ count ] == '0' )
{
count = -1;
break;
}
}
if ( count != -1 && carry == '1' )
{
if ( rJsign == '1' )
{
printf("结果下溢,结果当作机器零处理。");
getch();
exit(1);
}
else
{
printf("运算结果溢出");
getch();
exit(1);
}
}
else
{
if ( carry == '1' )
{
count = ( W - 1 );
while ( count > 0 )
{
rWnum[ count - 1 ] = rWnum[ count - 2 ];
count--;
}
rWnum[ count ] = '1';
if ( strcmp( rJnum, "0000000" ) == 0 )
{
strcpy( rJnum, "0000001" );
rJsign = '0';
}
else
{
if ( rJsign == '0' )
Add( rJnum, "0000001", rJnum );
else
D( rJnum, "0000001", rJnum );
}
}
}
rJsign = standard( rJsign, rJnum, rWnum );
if ( choose == '+' )
output( number1, number2, '+', rJsign, rJnum, rWsign, rWnum );
else
{
if ( number2[ J ] == '0' )
number2[ J ] = '1';
else
number2[ J ] = '0';
output( number1, number2, '-', rJsign, rJnum, rWsign, rWnum );
}
}
/*减运算*/
void sub( char * number1, char * number2 )
{
if ( number2[ J] == '0' )
number2[ J ] = '1';
else
number2[ J ] = '0';
add( number1, number2, '-' );
}
/*乘运算*/
void mul( char *number1, char *number2 )
{
char jsign1 = number1[0];
char jnum1[ J ];
char wsign1 = number1[J];
char wnum1[ W ];
char jsign2 = number2[0];
char jnum2[ J ];
char wsign2 = number2[J];
char wnum2[ W ];
char rJsign;
char rJnum[ J ];
char rWsign;
char rWnum[ W ];
char carry = '0';
int a = 0;
int i = 0;
int j = W - 2;
int k = W - 2;
char A[ W ];
divide( jnum1, wnum1, number1 );
divide( jnum2, wnum2, number2 );
while ( wnum1[ i ] == '0' )
i++;
if ( i == ( W - 1 ) )
{
printf( "结果为零!" );
getch();
exit(1);
}
i = 0;
while ( wnum2[ i ] == '0' )
i++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -