Savoir comment manipuler un reel sur c++

Fermé
Volatil_mythique Messages postés 3 Date d'inscription dimanche 23 juin 2013 Statut Membre Dernière intervention 29 juin 2013 - 29 juin 2013 à 15:07
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 13 juil. 2013 à 19:38
Bonjour, j'ai voulu faire un programme de conversion binaire mais j'arrive pas à manipuler la partie entiere et la partie decimale de mon reel... si vous pouvez m'aider.....




A voir également:

1 réponse

mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
Modifié par mamiemando le 13/07/2013 à 19:43
Qu'est ce que tu appelles la conversion binaire d'un double ?

Tu parles de ça ?
https://fr.wikipedia.org/wiki/IEEE_754

Pour extraire la partie entière d'un double, voir les fonction ceil, floor, round et nearbyint etc...
https://linux.die.net/man/3/ceil

Dans l'absolu tu peux afficher la valeur binaire stockée en mémoire comme suit :

#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <arpa/inet.h>

void print_uint8_bin(uint8_t x) {
    unsigned i, j;
    for (i = 0; i < 8; ++i) {
        j = 7 - i;
        printf("%d", (x & (1 << j)) ? 1 : 0);
        if (i % 4 == 3) printf(" ");
    }
}

void print_bytes_impl(uint8_t * bytes, size_t num_bytes) {
    size_t i;
    for (i = 0; i < num_bytes; ++i, ++bytes) {
        print_uint8_bin(*bytes);
        printf(" ");
    }
    printf("\n");
}

#define print_bytes(x) print_bytes_impl((uint8_t *) &x, sizeof(x))

int main() {
    uint16_t i16 = htons(0x1234);
    uint32_t i32 = htonl(0x12345678);
    double   x   = 1.0;

    print_bytes(i16);
    print_bytes(i32);
    print_bytes(x);
    return 0;
}


... ce qui donne :

(mando@silk) (~) $ gcc toto.c && ./a.out 
0001 0010  0011 0100  
0001 0010  0011 0100  0101 0110  0111 1000  
0000 0000  0000 0000  0000 0000  0000 0000  0000 0000  0000 0000  1111 0000  0011 1111


Comme tu le vois pour un uint16_t et uint32_t il faut faire gaffe à l'endianness pour voir les bits dans le bon ordre (chose que je n'ai pas faite pour le double, où les bits de mantisses et d'exposants ne sont pas écrits dans l'ordre).
https://fr.wikipedia.org/wiki/Endianness

C'est pourquoi pour plus de lisibilité j'ai initialisé i16 avec une notation hexadécimale mais bien entendu tu peux utiliser la notation décimale si tu préfères. L'intérêt est ici de voir que chaque caractère hexadécimal correspond à 4 bits en notation binaire donc par exemple 1 correspond à 0001, 2 à 0010, 3 à 0011, etc... Ainsi on retrouve bien dans cet exemple que 0x1234 devient 0001 0010 0011 0100 et que chaque octet (byte en anglais) est écrit dans l'ordre.

En pratique un PC moderne utilise un encodage little-endian tandis que la représentation "mathématique" d'un nombre serait big-endian qui est celle utilisée en réseau. Les fonction htons et htonl permettent de s'abstraire de l'endianness utilisée par le système pour la traduire dans l'endianness "mathématique".

Bonne chance
0