Untitled
unknown
plain_text
2 years ago
3.2 kB
5
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] = "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;
}
Editor is loading...
Leave a Comment