C++ gérer un floatant
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

C++ gérer un floatant



  1. #1
    cosmoff

    C++ gérer un floatant


    ------

    bonjour,

    voila comme nous le savons tous, en programmation un floatant est une approximation, si je tape :
    Code:
    float nombre = 0.1;
    nombre est en réalité 0.100000001490... (norme IEEE-754)

    donc si je fais dans mon code :
    Code:
    float nombre = 0.1;
    nombre *= 1000000000 ;/*1 milliard*/
    cout<<"nombre = "<<nombre<<endl;
    Je devrais voir lors de mon affichage nombre = 100000001.49.... or ca m'affiche 1e+008

    Comment je peux voir l'approximation?

    Merci d'avance

    -----

  2. #2
    pm42

    Re : C++ gérer un floatant

    Tu as essayé avec des double à la place des float ?
    Juste pour voir.

  3. #3
    cosmoff

    Re : C++ gérer un floatant

    ca ne change rien

  4. #4
    Dlzlogic

    Re : C++ gérer un floatant

    Bonjour,
    L'informatique est un outil de calcul. Le problème est savoir ce que vous voulez faire, un calcul ou vérifier la machine.
    J'ai fait un essai.
    Code:
    int main()  
    {
      double f=0.1;
      f*=2;
      fprintf(espion,"Le nombre  = %0.20f\n",f);
      return 0;
    }
    et le résultat :
    Le nombre = 0.20000000000000001110
    En fait, je ne sais pas du tout ce que fait mon compilateur. Par contre ce que je sais est que il ne faut jamais comparer des flottants avec le signe '=='.

  5. A voir en vidéo sur Futura
  6. #5
    Paraboloide_Hyperbolique

    Re : C++ gérer un floatant

    Bonjour,

    En plus du fait que l'intervalle entre deux flottants consécutifs n'est pas constant, "cout" a la sale habitude d'arrondir les nombres qu'il affiche. Il y a moyen d'en paramétrer l'affichage*, mais il est bien plus facile (à mon goût) d'utiliser un "(f)printf" dans lequel on peut directement spécifier le format d'affichage (comme l'a fait Dlzlogic).

    *Voir:
    http://en.cppreference.com/w/cpp/io/manip/setprecision
    http://en.cppreference.com/w/cpp/io/manip/fixed

  7. #6
    lou_ibmix_xi

    Re : C++ gérer un floatant

    En fait, je ne sais pas du tout ce que fait mon compilateur. Par contre ce que je sais est que il ne faut jamais comparer des flottants avec le signe '=='.
    Effectivement attention aux flottants. Si on se fout de la reproductibilité et de la "précision" (et/ou de sa dilution), pas de problème (et on a souvent intérêt à mettre des options comme -ffast_math qui peuvent avoir des gains de perf important). Sinon il faut connaître ieee 754 par coeur, et connaître les subtilités décrites là-bas par exemple, où utiliser de la virgule fixe ou autre représentation rationnelles.

  8. #7
    cosmoff

    Re : C++ gérer un floatant

    En effet printf est mieux adapté, merci beaucoup de votre aide

  9. #8
    jiherve

    Re : C++ gérer un floatant

    Bonjour
    Again and again l'inoxydable :
    https://docs.oracle.com/cd/E19957-01..._goldberg.html
    Telechargez imprimez !
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    polo974

    Re : C++ gérer un floatant

    sans oublier que (sauf option exotique), C et C++ font les calculs en double, ce qui fait qu'un prog écris avec des float sera plus gourmand en temps que le même écris avec des double (j'avais constaté ça avec xfoil quand il a été porté du fortran au C(++).
    On gagnait 30% en vitesse avec juste un (affreux) #define float double

    Donc dès qu'on touche un float (autrement que pour le copier), il est converti en double.

    Pour bien voir ce qu'il se passe, le plus simple est de faire une union { char[8] c; double d;} et dumper en hexa les octets...


    ps: (pour info: xfoil de Marc Drela porté par Matthieu Scherrer (xflr5))
    Jusqu'ici tout va bien...

  11. #10
    Dlzlogic

    Re : C++ gérer un floatant

    Bonjour Polo,
    C'est amusant cette info. Il est vrai que toutes les fonctions math sont en double, mais je ne suis pas sûr que mon compilateur fasse la transformation systématiquement. Ce serait intéressant de faire des tests.
    D'un autre côté, il y a des problèmes d'espace mémoire. Pour un certain programme, le problème se posait, j'ai bien réfléchi et j'ai opté pour du long int. Par rapport au float, je gagne 2 chiffres et ça prend deux fois moins de mémoire que du double. Ca tourne depuis une quinzaine d'années et je n'ai jamais eu de souci.
    J'ai cherché à voir ce qu'était Xfoil, mais l'article est en anglais et je suis paresseux.
    Bonne journée.

  12. #11
    Jack
    Modérateur

    Re : C++ gérer un floatant

    Ca doit dépendre du compilateur et du processeur cible. pas sur donc que les doubles soient convertis en float en l’absence d'un FPU par exemple.

  13. #12
    polo974

    Re : C++ gérer un floatant

    Bonjour,
    oui, j'avoue, je me suis emballé... actuellement mon gcc opère effectivement en float sur des floats. mais à l'époque, j'étais du coté obscur de la chose et j'utilisais un vc6 (ça date...).

    enfin, quoi qu'il en soit, si vous faites un f * 2.5; la constante est un double et le calcul se fait en double. il faut préciser pour les constantes et écrire 2.5f pour forcer le float...

    et quand on bosse avec les fonctions mathématiques qui sont principalement en double, autant ne pas se casser la tête à caster dans tous les sens...


    (j'autorise bien sûr tout modo à marquer mon affirmation du message précédent comme douteuse...)
    Jusqu'ici tout va bien...

  14. #13
    jiherve

    Re : C++ gérer un floatant

    Bonsoir
    Tous les processeurs de PC actuels et même passés embarquent une FPU (fut elle minimale) ce fut d'ailleurs dans cette FPU qu'il y eu un bug sur le Pentium I.
    Et comme tous sont maintenant en 64 bits cela ne coute pas grand chose de passer en double.
    le 68020 et sont petit pote 68881 c'est fini!
    il y eu même un coproc flottant pour 6809 : AMD9511 et là il fallait gérer le temps réel des calculs avec soin.
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    pm42

    Re : C++ gérer un floatant

    Citation Envoyé par jiherve Voir le message
    Tous les processeurs de PC actuels et même passés embarquent une FPU (fut elle minimale) ce fut d'ailleurs dans cette FPU qu'il y eu un bug sur le Pentium I.
    Et comme tous sont maintenant en 64 bits cela ne coute pas grand chose de passer en double.
    Oui mais quand on parle C et C++, c'est aussi parfois pour de l'embarqué et là, les choses sont un peu différentes.

  16. #15
    jiherve

    Re : C++ gérer un floatant

    Re
    en embarqué , mis à par les petits bidules, le processeur est souvent une machine (µC ou DSP) qui possède aujourd'hui une FPU,pour les autres, il y en a encore, on évitera le plus souvent possible le flottant en calculant en virgule fixe. Et reste le CORDIC qui fait toujours merveille.
    JR
    l'électronique c'est pas du vaudou!

  17. #16
    Bluedeep

    Re : C++ gérer un floatant

    Bonjour

    Citation Envoyé par jiherve Voir le message
    Tous les processeurs de PC actuels et même passés embarquent une FPU
    Pour être exact, depuis la sortie du 80486 en 1989 (même si une version "dégradée" sans FPU est sortie par la suite , le 80486SX).

  18. #17
    bastien31

    Re : C++ gérer un floatant

    Pour complexifier le tout certain FPU embarqué ne gère que les flottant et pas les doubles... du genre ARM cortex M4

Discussions similaires

  1. gérer une bibliothéque
    Par invite625ca7d1 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 25/03/2011, 23h25
  2. Gérer le Temps sur un PIC
    Par invite11fdcbbe dans le forum Électronique
    Réponses: 3
    Dernier message: 25/02/2010, 01h41
  3. gérer 2 port COM
    Par inviteb0aa7dd4 dans le forum Électronique
    Réponses: 3
    Dernier message: 13/04/2009, 23h11
  4. Gérer la charge
    Par invite5c708d0f dans le forum TPE / TIPE et autres travaux
    Réponses: 2
    Dernier message: 18/05/2007, 01h06
  5. gérer sa vie
    Par invitee17aeca5 dans le forum [ARCHIVE] Psychologie / Sociologie
    Réponses: 10
    Dernier message: 02/11/2004, 20h24