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

C++ Discussion :

Type entier vers flottant.


Sujet :

C++

  1. #1
    Membre régulier
    Type entier vers flottant.
    Bonjour,
    Quelqu’un pourrait m’expliquer comment modifier cette constante pour que le résultat affiche un arrondie au plus proche à 2 chiffres après la virgule ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    //Extrapolation de 173° à 180° = 2559,306358381503
     
    const int T180=520+(((2480-520)/173)*180);


    Ici 2559,31

    Merci pour votre aide.

  2. #2
    Expert éminent
    il faut relire tes cours sur la notion de type int, float, ...

    Et une autre précision , en C et C++, les opérations (+, *, / et -) prennent le type le "plus large" pour calculer.
    Donc int/ int donne une division entière et non pas une division flottante

    mais évidemment, il faut que ta variable puisse accepter le résultat sans troncature.


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        const int T180 = 520+(((2480-520)/173)*180);
        const float T180_01 = 520+(((2480-520)/ (float) 173)*180);
        const float T180_02 = 520+(((2480-520)/ 173.0)*180);
     
        std::cout << "value : " << T180 << ", value : " << T180_01 << ", value : " << T180_02 << std::endl;

  3. #3
    Membre régulier
    J’avoue être un peu largué, auriez-vous un petit exemple concret ?

  4. #4
    Membre éclairé
    Illustration
    Bonjour,

    Ce qu'explique Foetus peut s'illustrer ainsi :

    • 7/3 donne 2 (int /int -> int)
    • 7.0/3 ou 7/3.0 ou 7.0/3.0 donnent 2.3333... (float/int -> float, int/float -> float, et bien sûr float/float -> float)

    Salutations
    Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better. (Samuel Beckett)

  5. #5
    Expert éminent
    En même temps, je ne sais pas quoi dire entre @NeriXs qui passe plus de temps à poster au lieu de mettre des nombres flottants/ réels partout (quitte à créer autant de variables que de valeurs fixes) et le fait qu'il (et @Guesset apparemment ) ne sache pas utiliser la balise spoiler (divulgâcher en bon françois, il faut appuyer sur le bouton montrer à droite)

  6. #6
    Membre régulier
    Citation Envoyé par foetus Voir le message
    En même temps, je ne sais pas quoi dire entre @NeriXs qui passe plus de temps à poster au lieu de mettre des nombres flottants/ réels partout (quitte à créer autant de variables que de valeurs fixes
    Désolé, j'essaie toujours de mettre la charrue avant les bœufs

    Citation Envoyé par foetus Voir le message
    et le fait qu'il (et @Guesset apparemment )
    Là, je n'ai pas tous compris.

    -------------------------------------------------------------------------------------

    Pour en revenir à mon code!

    Les valeurs affichées sont bonnes:

    Bienvenue sur le moniteur série.
    L'extrapolation à 180°, de 173° entre la butée mini: 520 µS et la butée maxi: 2480 µS est égale à: 2559.31 µS.
    1° est égale à 11.33 µS.

    0° = 520.00 µS
    1° = 531.33 µS
    173° = 2480.00 µS
    180° = 2559.31 µS
    Je ne suis vraiment pas sûr que ma gestion soit faite dans les règles de l'art.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include <Servo.h>
     
    const byte ServoPin = 10;
    const int LowerPos = 520 ; //Butée Mini du servo
    const int UpperPos = 2480 ; //Butée Maxi du servo
    const int Range = 173 ; //Plage de déplacement en degrés
    const float T180 = LowerPos + (((float)(UpperPos - LowerPos) / Range) * 180) ; //Extrapolation à 180° = 2559,306358381503
    const float UsRange = (T180 - LowerPos) / 180 ; // 1° = 11,32944444444444 µS
     
    Servo myservo;  // create servo object to control a servo
    void setup() {
      Serial.begin(115200);
      myservo.attach(ServoPin, LowerPos, T180);
      Serial.println("Bienvenue sur le moniteur série.");
     
      Serial.print("L'extrapolation à 180°, de ");
      Serial.print(Range);
      Serial.print("° entre la butée mini: ");
      Serial.print(LowerPos);
      Serial.print(" µS et la butée maxi: ");
      Serial.print(UpperPos);
      Serial.print(" µS est égale à: ");
      Serial.print (T180);
      Serial.println(" µS.");
     
      Serial.print("1° est égale à ");
      Serial.print(UsRange);
      Serial.println(" µS.");
      Serial.println();
     
    }
     
    void loop() {
      int PosDeg = Serial.parseInt(); // PosDeg = la position saisie dans le moniteur série de 0 à 173°
      float PosUs = LowerPos + (PosDeg * UsRange); // degré en µS
      if (Serial.available() > 0) {
        Serial.print(PosDeg);
        Serial.print("° = ");
        Serial.print(PosUs,2);
        Serial.println(" µS");
     
      }
        clearSerialBuffer();  
    }
     
    void clearSerialBuffer() {
      //clear serial buffer (but do nothing with it)
      while (Serial.available())
      {
        Serial.read();
      }
    }

  7. #7
    Rédacteur/Modérateur

    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  8. #8
    Membre régulier
    Lire et vraiment tous comprendre ce n'est pas toujours évidant.
    Je ne viens pas du monde de la programmation et n'ai pas la prétention d'être programmeur. Je joue plus occasionnellement avec le langage.
    Je manque de rigueur et ne sais pas toujours employer les bons termes pour trouver les méthodes à utiliser.
    Alors me voilà avec mon indélicatesse, ma lourdeur, je ne percute pas toujours du premier coup! Et ai bien conscience que je devrais passer par une phase d'apprentissage et de recherche au préalable.
    Mais grâce à vous j'arrive à faire quelque petit truc sympa.