Class std::ratio, comment ça marche.

Oups ! C'est quoi cette syntaxe ?

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Dans l’objectif d’aider Paul, je me suis refait une classe CRationnel, pour le guider, … avant de tomber par hasard sur la class ratio de la STL. Mais les exemple de cppreference sont incompréhensible pour moi:

#include <iostream>
#include <ratio>
 
int main()
{
    using two_third = std::ratio<2, 3>;
    using one_sixth = std::ratio<1, 6>;
 
    using sum = std::ratio_add<two_third, one_sixth>;
    std::cout << "2/3 + 1/6 = " << sum::num << '/' << sum::den << '\n';
}

Ca sert à quoi ce using ? Ca doit faire référence à ça, mais je ne comprend pas. que veut dire : "adds two ratio objects at compile-time" ? Ce n’est pas une librairie que l’on peu appeler ? Ca ne fonctionne qu’a la compilation ? …

Merci, si vous pouvez m’apporter vos lumières.

Cordialement.

Édité par Dedeun

+0 -0
Auteur du sujet

Merci InformaticienZéro,

mais …

Oups! Mais ca sert à quoi de faire une "librairie" qui ne fonctionne qu’avec des constantes et des littéraux ? Parce que si les calcul ne sont fait qu’à la compilation, on ne peut utiliser que des constantes et des littéraux !

Donc dans mon cas:

  • "two_third" et "one_sixth" sont des types, pas des variables ?

  • "std::ratio_add" a besoin de 2 types pour faire l’opération ?

  • et dans ce cas, c’est quoi num et den ? des constantes ?

Je comprends toujours pas à quoi ça peut servir !

Mais déjà un merci pour la réponse rapide.

+0 -0

La bibliothèque ratio peut pré-compiler certaines parties du code (support) mais y’a une partie qui s’exécute durant l’exécution du code. (voir plus bas)

Édité par Yarflam

Tant de choses, tant de vies, tant de possibilités.

+0 -0
Auteur du sujet

Merci Yarflam pour ta réponse,

Mais elle semble ne pas être en accord avec ce que j’ai lu sur CPPREFERENCE, et ce que j’en comprends.

Peux-tu m’en dire plus sur la "partie qui s’exécute durant l’exécution du code" ? As-tu un exemple ?

Merci pour ta réponse.

Cordialement.

+0 -0

Cette réponse a aidé l’auteur du sujet

Tu as raison, je me suis trompé sur toute la ligne concernant cette bibliothèque - mea culpa.

Elle est initialement prévue comme template pour définir des ratios de conversions ; en particulier le système international d’unités :

  typedef ratio<1,       1000000000000000000> atto;
  typedef ratio<1,          1000000000000000> femto;
  typedef ratio<1,             1000000000000> pico;
  typedef ratio<1,                1000000000> nano;
  typedef ratio<1,                   1000000> micro;
  typedef ratio<1,                      1000> milli;
  typedef ratio<1,                       100> centi;
  typedef ratio<1,                        10> deci;
  typedef ratio<                       10, 1> deca;
  typedef ratio<                      100, 1> hecto;
  typedef ratio<                     1000, 1> kilo;
  typedef ratio<                  1000000, 1> mega;
  typedef ratio<               1000000000, 1> giga;
  typedef ratio<            1000000000000, 1> tera;
  typedef ratio<         1000000000000000, 1> peta;
  typedef ratio<      1000000000000000000, 1> exa;

Code source

Ce sont des constantes pré-calculées. :)

Tant de choses, tant de vies, tant de possibilités.

+0 -0

Cette réponse a aidé l’auteur du sujet

std::duration fait du calcul runtime-time en les utilisant.

Avoir le ratio à la compilation permet aussi de vérifier que convertir std::seconds en std::minutes résulte d’une perte de précision et de bloquer cette conversion à la compilation.

Du coup, pour pouvoir calculer un ratio plus facilement et sans coût, il y a plusieurs template pour faire des calculs. Il y a aussi la possibilité d’avoir le ratio minimal pour que std::ratio<2,10>::type soit du type std::ratio<1,5>, ce qui évite d’avoir des types différents pour un ratio identique.

+0 -0
Auteur du sujet

Bonne idée, LMGHS ! Mais, c’est pas pour moi, c’est pour Paul ! (qui ne se connecte plus d’ailleurs! il va avoir du mal a progresser.)

Mais merci quand même!

cordialement.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte