IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Codage] Conversion réel en binaire


Sujet :

Langage Java

  1. #1
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut [Codage] Conversion réel en binaire
    Bonjour à toutes et à tous,

    dans le cadre d'un projet (universitaire) de compression, je dois implémenter un algorithme qui permet de compresser la chaîne de caractères donnée.

    Pour ça, je dois transformer des nombres en réels en binaire ( selon la norme IEEE je pense, car non spécifié ). Y a t'il une fonction dans l'API toute faite ou faut-il coder cela soit même?



    [edit]
    Citation Envoyé par partie de l'énoncé
    On note ensuite le mot binaire formé par les mk chiffres après la virgule de l'écriture en base 2 du réel ak

  2. #2
    Membre confirmé Avatar de Diablo_22
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2005
    Messages : 498
    Points : 490
    Points
    490
    Par défaut
    Pour une conversion en utilisant la norme IEEE, on a les méthodes suivantes:
    - intBitsToFloat(int)
    - floatToIntBits(float value)

    SOURCE SUN

  3. #3
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Perplexe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(Double.doubleToLongBits(3.5));
    me renvoi :
    4615063718147915776
    alors que j'attend :
    01000000011000000000000000000000
    J'utilise mal la chose?
    [edit] Je bosse avec des double et non Double, mais je ne sais pas comment faire pour autant

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    En fait, la methode Double.doubleToLongBits te donne un long.
    Je pense que si tu veux l'afficher, il faut encore decortiquer en utilisant les &. Parce que sinon, cette suite de bit sera converti en nombre, puis en chaine et donc te donne un nombre.

    Pourquoi ne pas utiliser directement l'opérateur & avec un double ?
    Parce que c'est interdit avec les "double" et les "float"

  5. #5
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Tu pourrai donner un exemple ?

    J'ai du mal à te suivre


  6. #6
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String binaire = Long.toBinaryString(Double.doubleToLongBits(3.5))

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    beaucoup Rom, seulement le résultat que j'obtiens n'est pas cohérent car ta méthode me renvoi (pour 2.5) :
    100000000000100000000000000000000000000000000000000000000000000
    tandis que celle d'un convertisseur me renvoi :
    01000000001000000000000000000000
    Je sais pas lequel est correcte...

    D'où peut venir cette divergence?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    138
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 138
    Points : 120
    Points
    120
    Par défaut
    Pour être franc, je ne sais pas lequel est le bon.
    Mais si tu ajoutes au début de la 1ere suite de 1 et de 0 un 0, tu as exactement 64 catactères, donc 64 bits. pour le 2eme nombre, tu as 32 caractères, donc un nombre en 32 bit.

    Comme les doubles font 64 caractères, je pense que le 1er est plus juste.

    Cependant, il y a peut être un problème de little endian et de big endian.
    En informatique, pour les nombres sur 32 bits (donc sur 4 octets), il peut y avoir la forme big endian (poids fort devant:AABB), ou la forme little endian (point faible devant:BBAA), je pense qu'il doit y avoir un système semblable pour le 64 bits, mais je ne le connais pas. Pour avoir plus d'info, je te conseil google.

    Reste a savoir le format (big endian/little endian) que tu soihaites afficher.

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par buchs
    beaucoup Rom, seulement le résultat que j'obtiens n'est pas cohérent car ta méthode me renvoi (pour 2.5) :

    tandis que celle d'un convertisseur me renvoi :


    Je sais pas lequel est correcte...

    D'où peut venir cette divergence?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String binaire = Integer.toBinaryString(Float.floatToIntBits(3.5f))
    EDIT: il faut juste rajouter des 0 devant pour qu'il y ait 64 ou 32 bits selon le cas, le toBinaryString n'ajoute pas de 0 non significatifs...

  10. #10
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Yes, beaucoup Rom, t'es un génie

    Mais reste une question, l'algo stipule que je dois prendre un certains nombres de chiffres après la virgule... Et la, je vois pas trop de virgules, enfin comment définir où elle est...

    J'suis un peu perdu ! Les réels peuvent ils aussi s'écrirent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0101 , 1010 1010 0011 0011 1001
    ?

  11. #11
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par buchs
    J'suis un peu perdu ! Les réels peuvent ils aussi s'écrirent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0101 , 1010 1010 0011 0011 1001
    ?
    Ça c'est en virgule fixe, qui n'est jamais codée dans les languages de programmation (si on en a besoin, on utilise des int, et on divise à l'affichage).

    Ce qui est utilisée, c'est la virgule flottante, séparée en 3 parties:
    BIT DE SIGNE : 1 pour -, 0 pour +
    EXPOSANT : exposant biaisé
    MANTISSE : chiffres significatifs, avec un 1 implicite

    En simplifiant, un nombre c'est signe * mantisse * 2^exposant.

    La répartition est la suivante :
    double (64 bits) : 1 | 11 | 53
    float (32 bits) : 1 | 8 | 23

    L'exposant est biaisé, pour obtenir l'exposant "lisible" il faut retirer 2^k-1 (si je me souviens bien) avec k = 8 pour les floats et 11 pour les doubles (à vérifier dans la norme IEEE).

    La mantisse contient un 1 implicite en première position, donc il représente respectivement 54 ou 24 chiffres significatifs.

    Ça c'est pour la majorité des chiffres, après il y a des codages spéciaux (pour 0 par exemple, car c'est le seul chiffre où le 1 implicite ne peut pas marcher), pour NaN, pour +infini, pour -infini, et il y a aussi les nombres dénormalisés pour les nombres très petits (pas de 1 implicite et exposant prédéfini).

    Bon courage

  12. #12
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Merci pour toutes ces explications

    Néanmoins, je vais attendre avant de coder tout ça tête baissée, je vais déjà tenter de comprendre cet algo car il m'a l'air bien bizzare sur certains points, notamment sur l'écriture exacte attendue

    Je ne sais pas s'il faut des binaires à virgules ou s'il faut les transformer sans, bref, vais déjà tenter de dérouler manuellement l'algo...

    encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Algo Génétique, Codage réels en binaire
    Par Giansolo dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 23/06/2010, 17h16
  2. conversion d'un réel en binaire
    Par chana4 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 02/05/2008, 20h02
  3. Codage/ décodage réels binaires
    Par modaffar dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 10/07/2007, 16h53
  4. [LabView-MATLAB] Conversion de fichier binaire
    Par flzox dans le forum LabVIEW
    Réponses: 3
    Dernier message: 20/01/2007, 18h42
  5. Conversion ascii=> hexa=>binaire
    Par grunk dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 18h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo