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 :

Float et représentation scientifique


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Float et représentation scientifique
    Bonjour,

    Lorsque je tape ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.out.println("Float.MAX_VALUE : " + Float.MAX_VALUE);
    J'obtiens le résultat suivant : 3.4028235E38

    Normal, sur le papier tout au moins car si je transforme en notation non scientifique
    J'obtiens le résultat suivant : 340282350000000000000000000000000000000
    qui n'est pas un float

    Bien sûr , je peux ajouter .0 à la fin et cela devient un float mais je ne comprends pas

    Quelqu'un pourrait-il m'expliquer ??

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    ?

    Tu croyais que les float, par nature, devaient forcément avoir une virgule ?

    C'est vrai que c'est l'une des deux manières pour qu'un littéral numérique soit à virgule flottante, mais :
    - Ça n'a aucun rapport avec ce que va produire String.valueOf(float)
    - On peut aussi juste mettre un f ou un d derrière. La virgule n'est pas obligatoire. D'ailleurs il y a aussi la notation scientifique qui marche très bien, preuve s'il en est que c'est bien un float.
    - De toute façon, un littéral entier (et n'importe quelle expression entière d'ailleurs) est converti implicitement en float ou en double sans aucun problème.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut Tu croyais que les float, par nature, devaient forcément avoir une virgule ?
    Bonjour thelvin,

    C'est un peu çà, oui !! mais allons plus loin

    Dirais-tu que la valeur maximale d'un float peut correspondre à ceci :

    0 bit de signe positif
    11111111 (8 fois 1) pour exposant
    11111111111111111111111 (23 fois 1) pour la mantisse

    Merci de ta réponse

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par michelp3 Voir le message
    C'est un peu çà, oui !!
    Ben ça servirait à rien d'avoir un système numérique incapable de représenter des trucs simples comme 1 ou 2.

    Citation Envoyé par michelp3 Voir le message
    Dirais-tu que la valeur maximale d'un float peut correspondre à ceci :

    0 bit de signe positif
    11111111 (8 fois 1) pour exposant
    11111111111111111111111 (23 fois 1) pour la mantisse
    Non.

    Je rappelle que les floats, pour gérer les cas aux limites, ont la notion de l'infini. Ils peuvent représenter des valeurs comme l'infini positif ou négatif. Pour cela ils utilisent l'exposant maximal : 8 fois 1. Dans ce cas-là, la mantisse doit rester à zéro. Si on a un exposant maximal et une mantisse non-zéro, ça représente NaN (Not-a-Number), le résultat par exemple de zéro divisé par zéro, ou l'infini moins l'infini.

    Donc ce que tu nous montres là, c'est NaN.

    Supposons qu'on mette la mantisse à zéro, là ça représente l'infini positif. On peut considérer que c'est la valeur maximale pour float. Mais Float.MAX_VALUE ne correspond pas à ça. Pour l'infini positif c'est Float.POSITIVE_INFINITY.

    Float.MAX_VALUE représente la valeur finie maximale que les floats peuvent représenter. Cela s'obtient avec l'exposant maximal moins un, et la mantisse maximale. Donc un exposant représentant +127, et une mantisse avec que des 1
    Cette mantisse représente donc en binaire 1,1111 etc, soit grosso-modo 2 en décimal, moins tous les 1 en dehors de la précision, c'est à dire en décimal 1 / (2 puissance 23). Donc une mantisse de 2 - (2 puissance -23)

    Donc grosso-modo :
    (2 - (2 puissance -23)) * (2 puissance 127) = 3,4028 * (10 puissance 38) et des brouettes.
    On est vraiment pas loin, la différence après la virgule vient du fait que ma formule va au-delà de la précision des floats.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    315
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 315
    Par défaut
    Je te remercie de cette explication ultra complète

    J'ai compris plus ou moins le principe mais je suis un peu perplexe pour le
    passage :

    "Cette mantisse représente donc en binaire 1,1111 etc, soit grosso-modo 2 en décimal, moins tous les 1 en dehors de la précision, c'est à dire en décimal 1 / (2 puissance 23). Donc une mantisse de 2 - (2 puissance -23)

    Donc grosso-modo :
    (2 - (2 puissance -23)) * (2 puissance 127) = 3,4028 * (10 puissance 38) et des brouettes.
    On est vraiment pas loin, la différence après la virgule vient du fait que ma formule va au-delà de la précision des floats. "

    Si tu avais une DOC complémentaire qui puisse combler mes lacunes , ce serait avec plaisir

    Néanmoins, je te remercie vivement, bonne journée

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pas faux, laissons parler Wikipédia pour décrire les nombres à virgule flottante IEEE 754
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. Format float scientifique
    Par haraigo dans le forum Général Python
    Réponses: 4
    Dernier message: 09/03/2012, 20h21
  2. [BigDecimal] Eviter la représentation scientifique
    Par Jidefix dans le forum Général Java
    Réponses: 0
    Dernier message: 30/09/2009, 15h09
  3. Conversion string (au format scientifique) en float
    Par Olivié dans le forum Langage
    Réponses: 2
    Dernier message: 18/05/2009, 17h13
  4. Format scientifique pour les float
    Par Mohammmed dans le forum Langage SQL
    Réponses: 5
    Dernier message: 29/01/2008, 12h28
  5. comment représenter un float sur 16 bit
    Par hamska2 dans le forum C
    Réponses: 3
    Dernier message: 19/06/2007, 15h26

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