2017-10-21 83 views
0

Je voudrais savoir si un exposant binaire peut être stocké sous forme de virgule flottante. Voici un exemple de ce que je veux dire:Un exposant peut-il être stocké en tant que nombre à virgule flottante?

En nombres à virgule flottante système utilise un 10-bit two's complement mantissa et un 6-bit floating point exponent

Convertir 0101001000 000100 en denary:

Eh bien, si je suppose que l'exposant est en binaire normale, l'exposant est égal à 4

Ainsi, le point décimal dans la mantisse va ici d'abord:

0.101001000 

Ensuite, nous passons le point décimal 4 places vers la droite, ce qui donne

01010.01 

ce qui équivaut à 10.25 denary.

Cette réponse sera très différente si l'exposant peut être stocké avec un nombre décimal. Je demande si l'exposant peut être stocké de cette manière.

Répondre

0

si un exposant binaire peut être stocké sous forme de virgule flottante

Oui.
Pour former le denary à partir d'un chaîne, utilisez strtol().

Pour convertir le denaire en un point flottant, extrayez les bits dans sa "mantisse" et son exposant. Former la valeur FP avec ldexp().

double ldexp(double x, int exp); 

Les fonctions ldexp multiplier un nombre à virgule flottante par une puissance entière de 2.
c11dr §7.12.6.7 2

#include <math.h> 
#include <stdint.h> 
#include <stdio.h> 
#include <stdlib.h> 

#define denary_MANIISSA_EXPO 9 
#define denary_MANIISSA_MASK 0xFFC0u 
#define denary_EXPO_SCALE 64 

double denary_to_double(denary d) { 
    int expo = d & (denary_EXPO_SCALE - 1); 
    int mantissa = (d - expo)/denary_EXPO_SCALE; 
    return ldexp(mantissa, expo - denary_MANIISSA_EXPO); 
} 

void denary_test(const char *s) { 
    denary d = (denary) strtol(s, NULL, 2); 
    printf("0x%04X -->", d & 0xFFFF); 
    printf(" %+.9f\n", denary_to_double(d)); 
} 
int main(void) { 
    denary_test("0101001000" "000100"); 
    denary_test("0000000000" "000000"); // zero 
    denary_test("0000000001" "000000"); // denary_POS_MIN 
    denary_test("1111111111" "000000"); // denary_NEG_MIN 
    denary_test("0111111111" "111111"); // denary_POS_MAX 
    denary_test("1000000000" "111111"); // denary_NEG_MAX 
} 

sortie

0x5204 --> +10.250000000 
0x0000 --> +0.000000000 
0x0040 --> +0.001953125 
0xFFC0 --> -0.001953125 
0x7FFF --> +9205357638345293824.000000000 
0x803F --> -9223372036854775808.000000000