Untitled
unknown
plain_text
a year ago
3.2 kB
3
Indexable
#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]; 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; }
Editor is loading...
Leave a Comment