Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.8 kB
3
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 = 3; // nr. de bits do expoente E
    int M = 4; // nr. de bits da mantissa M

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

    int expoente_aux_1 = 0;
    int mantissa_aux_1 = 0;

    int posicao_mantissa = -1;
    int posicao_expoente = E - 1;



    char bits[BUFSIZ] = "10000000";

    

    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