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
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
A voir également:
- Savoir comment manipuler un reel sur c++
- Blocage agriculteur carte en temps réel - Accueil - Transports & Cartes
- Regle taille reel - Guide
- Maps satellite en temps réel - Guide
- Google maps trafic en temps réel - Guide
- Jeu gratuit pour gagner de l'argent réel avis - Forum Téléchargement
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
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 :
... ce qui donne :
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
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