Untitled

mail@pastecode.io avatar
unknown
plain_text
2 months ago
3.2 kB
1
Indexable
Never
#include <stdio.h>
#include <math.h>


double formula_numeros_normais (char sinal, double mantissa, long int expoente, int nr_bits_expoente){

    double valor;
    long int bias = pow(2, (nr_bits_expoente - 1)) - 1;

    if (sinal == '0'){
        valor = 1.0 * (1.0 + mantissa) * pow(2, expoente - bias);
    }

    else{
        valor = (-1.0) * (1.0 + mantissa) * pow(2, expoente - bias);
    }


    return valor;
}


double formula_numeros_subnormais (char sinal, double mantissa, int nr_bits_expoente){

    double valor;
    long int bias = pow(2, (nr_bits_expoente - 1)) - 1;

    if (sinal == '0'){
        valor = 1 * mantissa * pow(2, (1 - bias));
    }

    else{
        valor = (-1) * mantissa * pow(2, (1 - bias));
    }

    return valor;
}

int main(){

    int N; // nr. de linhas do input
    int E; // nr. de bits do expoente E
    int M; // nr. de bits da mantissa M

    double valor;
    long int expoente; // expoente correspondente na base decimal
    double f; // parte fracionária da mantissa

    int expoente_aux_1;
    int mantissa_aux_1;

    int posicao_mantissa;
    int posicao_expoente;



    char bits[BUFSIZ] = "10000000";


    scanf("%d", &N); // ler o número das linhas de leitura


    
    for (int k = 0; k < N; k++){
        scanf("%d %d %s", &E, &M, &bits);

        expoente_aux_1 = 0;
        mantissa_aux_1 = 0;

        posicao_mantissa = -1;
        posicao_expoente = E - 1;

        f = 0;
        expoente = 0;

        for (int i = 1; i <= E; i++){
            if(bits[i] == '1'){
                expoente_aux_1++;
                expoente = expoente + pow(2, posicao_expoente);
            }

            posicao_expoente--;
        }

        for (int j = E + 1; j <= E + M; j++){
            if(bits[j] == '1'){
                mantissa_aux_1++;
                f = f + pow(2,posicao_mantissa);
            }

            posicao_mantissa--;
        }

        if (expoente_aux_1 == 0 && mantissa_aux_1 == 0){
            if (bits[0] == '0'){
                printf("%d\n", 0);
            }
            
            else{
                printf("%lg\n", -0.0);
            }

        }

        else if (expoente_aux_1 == E && mantissa_aux_1 == 0){
            if (bits[0] == '0'){
                printf("%s\n", "+Infinity");
            }
            
            else{
                printf("%s\n", "-Infinity");
            }
            
        }

        else if (expoente_aux_1 == E && mantissa_aux_1 > 0){
            printf("%s\n", "NaN");
        }

        else if (expoente_aux_1 == 0 && mantissa_aux_1 >= 1){
            valor = formula_numeros_subnormais(bits[0], f, E);
            printf("%lg\n", valor);
        }

        else if (expoente_aux_1 < E && expoente_aux_1 > 0){
            valor = formula_numeros_normais(bits[0], f, expoente, E);
            printf("%lg\n", valor);
        }
    }


    

    //printf("\n\nValor pretendido: %lg\nNr. de bits do expoente: %d\nNr. de bits da mantissa: %d\nExpoente: %ld\nMantissa (parte fracionaria): %lg\nNr. de bits do expoente a 1: %d\nNr. de bits da mantissa a 1: %d\nPrimeiro elemento do array (sign bit): %c\n", valor, E, M, expoente, f, expoente_aux_1, mantissa_aux_1, bits[0]);


    return 0;
}

Leave a Comment