⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 float.c

📁 我们组成原理课上的一个作业
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -