📄 float.c
字号:
if ( i == ( W - 1 ) )
{
printf( "结果为零!" );
getch();
exit(1);
}
for( a = 0; a < W - 1; a++ )
A[a] = '0';
A[a] = '\0';
for( i = 1; i <= W - 1; i++ )
{
if( '1' == wnum2[j] )
{
carry = Add( A, wnum1, A );
}
wnum2[j] = A[k];
for( k = W - 2; k >= 1; k-- )
A[ k ] = A[ k - 1 ];
k = W - 2;
A[0] = carry;
carry = '0';
j--;
}
strcpy( rWnum, A );
if ( wsign2 == wsign1 )
rWsign = '0';
else
rWsign = '1';
if ( jsign1 == jsign2 )
{
rJsign = jsign1;
carry = Add( jnum1, jnum2, rJnum );
if ( carry == '1' )
if ( rJsign == '1' )
{
printf("结果下溢,结果当作机器零处理。");
getch();
exit(1);
}
else
{
printf("运算结果溢出!");
getch();
exit(1);
}
}
else
{
D( jnum1, jnum2, rJnum );
if ( strcmp( jnum1, jnum2 ) > 0 )
rJsign = jsign1;
else
rJsign = jsign2;
}
rJsign = standard( rJsign, rJnum, rWnum );
output( number1, number2, '*', rJsign, rJnum, rWsign, rWnum );
for ( i = 0; i < N; i++ )
rWnum[ W - 1 - N + i ] = wnum2[ i ];
output( number1, number2, '*', rJsign, rJnum, rWsign, rWnum );
}
/*除运算*/
void div( 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';
char wsign;
int a,b,c;
int i = 0;
int j;
int k = 0;
char wnum2_Bu[ W ];
char shang[ W + 1 ];
char wnum2_BuSign = wsign2;
char wsign1_t;
char jiayi[ J ];
divide( jnum1, wnum1, number1 );
divide( jnum2, wnum2, number2 );
for( a = 0; a < W; a++ )
shang[a] = '0';
shang[ W ] = '\0';
for( a = 0; a < W - 1; a++)
{
if( wnum1[a] != '0' )
break;
}
if( a == W - 1 )
{
printf("\n被除数为0,结果为0\n");
return;
}
for( a = 0; a < W - 1; a++)
{
if( wnum2[a] != '0' )
break;
}
if( a == W - 1 )
{
printf("\n除数为0,运算结束!\n按任意键结束!\n");
getch();
return;
}
for( b = 0; b < J - 2; b++ )
jiayi[b] = '0';
jiayi[J - 2] = '1';
jiayi[J - 1] = '\0';
i = 0;
while((wnum2_Bu[i] = wnum2[i]) != '\0')
i++;
for( i = W - 2; i >= 0; i-- )
{
if( wnum2_Bu[i] == '1' )
{
for( i = i - 1; i >= 0; i-- )
{
if( wnum2_Bu[i] == '1' )
wnum2_Bu[i] = '0';
else
wnum2_Bu[i] = '1';
}
}
}
wsign1_t = '0';
wsign = '0';
for( i = W - 1; i >= 0; i-- )
{
if( wsign1_t == '0' )
{
carry = Add( wnum1, wnum2_Bu, wnum1 );
if( carry == '1' && i == (W - 1) )
{
i++;
for( k = W - 2; k >= 1; k-- )
wnum1[ k ] = wnum1[ k - 1 ];
wnum1[0] = '0';
if( jsign1 == '0' )
{
carry = Add( jnum1, jiayi, jnum1 );
if ( carry == '1' )
{
printf("阶码溢出!按任意键结束!\n");
getch();
exit(1);
}
}
else
{
carry = D( jnum1, jiayi, jnum1 );
if( carry == '1' )
{
for( b = 0; b < J - 1; b++ )
jnum1[b] = '0';
}
}
continue;
}
if( carry == '0' && wsign == '0' || carry == '1' && wsign == '1' )
{
wsign1_t = '1';
shang[k] = '0';
}
else
{
wsign1_t = '0';
shang[k] = '1';
}
}
else
{
carry = Add( wnum1, wnum2, wnum1 );
if( carry == '0' && wsign == '0' || carry == '1' && wsign == '1' )
{
wsign1_t = '0';
shang[k] = '1';
}
else
{
wsign1_t = '1';
shang[k] = '0';
}
}
wsign = wnum1[0];
for( j = 0; j < W - 2; j++ )
wnum1[j] = wnum1[j+1];
wnum1[j] = '0';
k++;
}
if ( wsign2 == wsign1 )
shang[0] = '0';
else
shang[0] = '1';
if ( jsign1 != jsign2 )
{
rJsign = jsign1;
carry = Add( jnum1, jnum2, rJnum );
if ( carry == '1' )
{
printf("阶码溢出!按任意键结束!\n");
getch();
exit(1);
}
}
else
{
rJsign = jsign1;
if ( strcmp( jnum1, jnum2 ) > 0 )
D( jnum1, jnum2, rJnum );
else
{
D( jnum2, jnum1, rJnum );
if( rJsign == '1' )
rJsign = '0';
else
rJsign = '1';
}
}
while( shang[1] != '1' )
{
for( c = 1; c < W - 1; c++ )
shang[c] = shang[c+1];
shang[W - 1] = '0';
if( rJsign != '0' )
{
carry = Add( rJnum, jiayi, rJnum );
if ( carry == '1' )
{
printf("阶码溢出!按任意键结束!\n");
getch();
exit(1);
}
}
else
{
carry = D( rJnum, jiayi, rJnum );
if( carry == '1' )
{
for( b = 0; b <= J - 1; b++ )
rJnum[b] = '0';
}
}
}
for( a = 0; a < J - 1; a++)
{
if( rJnum[a] != '0' )
break;
}
if( a == J - 1 )
{
rJsign = '0';
}
output( number1, number2, '/', rJsign, rJnum, shang[0], shang+1 );
}
void divide( char * jnum, char * wnum, char * number )
{
int i = 1;
for ( i = 1; i < J; i++ )
jnum[ i - 1 ] = number[ i ];
jnum[ J- 1 ] = '\0';
for( i = ( J + 1 ); i <= L; i++ )
wnum[ i - J - 1 ] = number[ i ];
}
int change( char * number )
{
int i = 0;
int r = 0;
for ( i = 0; i< ( J - 1 ); i++ )
{
if ( number[i] == '1')
r = r + 1;
if ( i != ( J - 2 ) )
r = r * 2;
}
return r;
}
char Add( char * num1, char * num2, char *result )
{
char carry = '0';
int count2 = strlen( num1 );
int i;
for ( i = ( count2 - 1 ); i >= 0; i-- )
{
if ( carry == '0')
{
if ( num1[ i ] == '0' && num2[ i ] == '0' )
{
result[ i ] = '0';
carry = '0';
}
else
if ( (num1[ i ] == '1' && num2[ i ] == '0') || ( num1[ i ] == '0' && num2[ i ] == '1') )
{
result[ i ] = '1';
carry = '0';
}
else
if ( num1[ i ] == '1'&&num2[ i ] == '1')
{
result[ i ] = '0';
carry = '1';
}
}
else
{
if ( num1[ i ] == '0' && num2[ i ] == '0' )
{
result[ i ] = '1';
carry = '0';
}
else
if ( (num1[ i ] == '1' && num2[ i ] == '0') || ( num1[ i ] == '0' && num2[ i ] == '1') )
{
result[ i ] = '0';
carry = '1';
}
else
if ( num1[ i ] == '1'&&num2[ i ] == '1')
{
result[ i ] = '1';
carry = '1';
}
}
}
result[ count2 ] = '\0';
return carry;
}
char D( char *num1, char *num2, char *result )
{
char carry = '0';
int count3 = strlen( num1 );
int i;
for ( i = ( count3 - 1 ); i >= 0; i-- )
{
if ( carry == '0')
{
if ( num1[ i ] == num2[ i ] )
{
result[ i ] = '0';
carry = '0';
}
else
if ( num1[ i ] == '1' && num2[ i ] == '0' )
{
result[ i ] = '1';
carry = '0';
}
else
if ( num1[ i ] == '0' && num2[ i ] == '1' )
{
result[ i ] = '1';
carry = '1';
}
}
else
{
if ( num1[ i ] == num2[ i ] )
{
result[ i ] = '1';
carry = '1';
}
else
if ( num1[ i ] == '1' && num2[ i ] == '0' )
{
result[ i ] = '0';
carry = '0';
}
else
if ( num1[ i ] == '0' && num2[ i ] == '1' )
{
result[ i ] = '0';
carry = '1';
}
}
}
result[ count3 ] = '\0';
return carry;
}
/*规格化*/
char standard( char Jsign, char * Jnum, char * Wnum )
{
int l = strlen( Wnum );
int i;
N = 0;
while ( Wnum[0] == '0' )
{
for( i = 0; i < ( l - 1 ); i++ )
{
Wnum[ i ] = Wnum[ i + 1 ];
}
Wnum[ i ] = '0';
N++;
if ( Jsign == '1' )
{
Add( Jnum, "0000001", Jnum );
if ( strcmp ( Jnum, "1111111" ) == 0 )
break;
}
else
{
D( Jnum, "0000001", Jnum );
if ( strcmp ( Jnum, "0000000" ) == 0 )
Jsign = '1';
}
}
return Jsign;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -