GNU Units sort en version 2.14

Posté par (page perso) . Édité par Davy Defaud, Benoît Sibaud, ZeroHeure, Xavier Claude et Nÿco. Modéré par Benoît Sibaud. Licence CC by-sa
54
21
mar.
2017
GNU

Le 7 mars 2017 sortait GNU Units 2.14. À cette occasion, je vous propose de découvrir cet outil qui n’est pas forcément le plus connu de tous. GNU Units se veut être une sorte de calculatrice centrée sur la gestion des unités. Units vous permet de convertir d’une unité à l’autre, au sein de près de 3 000 unités différentes (en comptant les valeurs monétaires). Il est le descendant de l’outil units développé par Bell Labs, il y a plus de trente ans.

Nouveautés

Depuis 2012, les sorties se font au rythme de un à deux par an, et on a principalement droit à des corrections de bogues, comme c’est le cas avec cette dernière version, ou une mise à jour des valeurs des constantes utilisées, comme en 2014 avec la mise à jour vers les nouvelles valeurs de 2014 CODATA.

Usage

Cet outil s’utilise uniquement en ligne de commande. Voyons un petit exemple :

$ units
Currency exchange rates from www.timegenie.com on 2017-03-20 
2982 units, 109 prefixes, 96 nonlinear units

You have: 1GB
You want: MB
    * 1000
    / 0.001

Il y a donc bien un millier de mégaoctets dans un gigaoctet. Vérifions le mébioctet :

You have: 1GiB
You want: MiB
    * 1024
    / 0.0009765625

Tout va bien. :)

Exemples plus complexes

Il est bien entendu possible de convertir vers des unités plus diverses et d’entremêler de multiples unités. Voici quelques exemples parlants :

You have: 123456 seconds
You want: hms
    34 hours + 17 minutes + 36 seconds
# `hms` est une abréviation de `hours;minutes;seconds`
# `time` rajoute les années et les jours si nécessaire, ce qui est plus général
# E = mc², avec 10 kilos
You have: 10 kg * c^2
You want: GJ
    * 8.9875518e+08
    / 1.1126501e-09
# Pour voir la définition d’une unité, ici la constante gravitationnelle
You have: G
You want: 
        Definition: 6.67408e-11 N m^2 / kg^2 = 6.67408e-11 m^3 / kg s^2
# Pour ajouter des valeurs dans différentes unités 
You have: 2 ft + 14 cm + 3|8 in
You want: m
    * 0.759125
    / 1.3173061

You have: 1.3 kJ + 512 cal
You want: J
    * 3443.6416
    / 0.00029039027

Évidemment, on ne peut pas faire n’importe quoi non plus :

You have: 42 cm + 69 N + 13
                       ^
Illegal sum or difference of non-conformable units

Enfin, une conversion monétaire :

You have: 10 euros
You want: yen
    * 1214.9
    / 0.00082311301

Mais sachez qu’il est possible de mettre à jour la base de données des valeurs monétaires en lançant units_cur.

Usage non interactif

units s’utilise plutôt en mode interactif, mais il est possible de le lancer également pour une seule conversion :

$ units '2 liters' gallon 
    * 0.4399385
    / 2.273045

Conclusion

Tout ceci ne fait qu’effleurer la surface de ce logiciel qui me semble méconnu. Pour plus d’information, je ne peux que vous conseiller de consulter la documentation. Qui sait, peut‐être que définir vos propres unités ou savoir que certaines unités varient en fonction de la langue du système peut s’avérer répondre à vos besoins ?

  • # Merci de l'info !

    Posté par . Évalué à 6.

    Finis les arrachages de cheveux avec le combo [fdisk parted cryptsetup lvm resize2fs] \o/

  • # Pas compris

    Posté par (page perso) . Évalué à 8.

    Je comprends rien à la sortie, c’est quoi le / et le * ?
    Le résultat est une multiplication/division à faire nous même ? (dans ce cas à quoi ça sert de donner des valeurs en entrée et pas juste des unités ?)

    Même le dernier exemple avec la conversion litre/gallon je comprends pas quel est le résultat.

    • [^] # Re: Pas compris

      Posté par (page perso) . Évalué à 6.

      C'est expliqué au tout début de la doc, Interacting with units :

      The result will be displayed in two ways. The first line of output, which is marked with a ‘*’ to indicate multiplication, gives the result of the conversion you have asked for. The second line of output, which is marked with a ‘/’ to indicate division, gives the inverse of the conversion factor.

      Ce n'est pas intuitif du tout je trouve.

      • [^] # Re: Pas compris

        Posté par . Évalué à 4.

        C'est le concept même des outils GNU !

      • [^] # Re: Pas compris

        Posté par . Évalué à 3.

        Faut utiliser l'option --one-line (-l) pour ne pas avoir la conversion inverse.
        J'avoue que j'aurai choisi un comportement où il faut explicitement demander la conversion inverse.

      • [^] # Système métrique…

        Posté par . Évalué à 8.

        Ce n'est pas intuitif du tout je trouve.

        En effet, mais ça peut être pratique :

        $ units kph m/s
                * 0.27777778
                / 3.6
        

        Si tu veux faire la conversion plus tard avec une calculatrice, ce sera plus facile et plus exact de diviser par 3,6.

        Le problème, c’est qu’il faut manifestement connaître les noms anglo-saxons des unités plutôt que leurs noms standard dans les normes internationales utilisées dans les pays civilisés :

        $ units km/h m/s
        conformability error
                1.5091902e+36 s / kg m
                1 m / s
        

        Oui, km/h pour lui, c’est kg × m / h. Hallucinant, non ?

        Pourtant, km marche :

        $ units miles km
                * 1.609344
                / 0.62137119
        

        dm aussi :

        $ units inch dm
                * 0.254
                / 3.9370079
        

        Cela dit, si le principe du système métrique avait été appliqué aux heures, on n’aurait pas à faire de conversion de km/h en m/s, juste à déplacer la virgule : 1 kilomètre par décijour (2,4 h), c’est la même chose que 10 mètres par millijour (1 min 26,4 s) ou 0,1 mètre par centième de millijour (0,864 s) ou encore O,1 kilomètre par centijour (14 min 24 s, presqu’1/4 h, la division qui serait la plus pratique pour les rendez-vous et les horaires de cours).

        Théorie du pot-au-feu : « Tout milieu où existe une notion de hauteur (notamment les milieux économique, politique, professionnels) se comporte comme un pot-au-feu : les mauvaises graisses remontent. »

        • [^] # Re: Système métrique…

          Posté par (page perso) . Évalué à 3.

          Oui quand on met juste deux unités la sortie est tout à fait adaptée, ça donne le taux de conversion dans les deux sens.
          Mais quand on met un calcul ou une valeur, ça devient très flou…

          # Pour ajouter des valeurs dans différentes unités 
          You have: 2 ft + 14 cm + 3|8 in
          You want: m
              * 0.759125
              / 1.3173061
          
          You have: 1.3 kJ + 512 cal
          You want: J
              * 3443.6416
              / 0.00029039027
          

          Là franchement je sèche, la division est un taux de conversion entre quoi et quoi?

          • [^] # Re: Système métrique…

            Posté par (page perso) . Évalué à 2.

            Pour ma rapport je le lis comme un rapport de grandeur entre ce que l'on veut et ce que l'on a. Par exemple on peut écrire :

            You have:  1 km
            You want: 500m
                    * 2
                    / 0.5
            

            Ce que je lis comme You have 2 * what you want, ou You want 0.5 * what you have. Si l'on ne donne pas de valeur à l'unité, celle-ci vaut par défaut 1

          • [^] # Re: Système métrique…

            Posté par (page perso) . Évalué à 5.

            $ units --verbose --show-factor
            Currency exchange rates from www.timegenie.com on 2016-06-21 
            2926 units, 109 prefixes, 88 nonlinear units
            
            You have: 2 ft + 14 cm + 3|8 in
            You want: m
                2 ft + 14 cm + 3|8 in = 0.759125 m
                2 ft + 14 cm + 3|8 in = (1 / 1.3173061) m
            You have: 1.3 kJ + 512 cal
            You want: J
                1.3 kJ + 512 cal = 3442.208 J
                1.3 kJ + 512 cal = (1 / 0.00029051121) J
            
        • [^] # Re: Système métrique…

          Posté par (page perso) . Évalué à 2.

          Pourtant, km marche :

          Je pense que c'est parce que «h» c'est pour «hecto» aussi, donc pour les heures c'est «hr» ou «hour». Par exemple units km/hr m/s marche correctement chez moi (avec le units d'OpenBSD, mais j'imagine que ça doit être pareil).

          • [^] # Re: Système métrique…

            Posté par (page perso) . Évalué à 2.

            Par contre, sous OpenBSD, km/h c'est 10 m, pas le truc fantaisiste que t'obtiens. Et le calcul est simple : km/h == 1000 * m / 100 :)

    • [^] # Re: Pas compris

      Posté par (page perso) . Évalué à 3.

      Avec le --verbose

      $ units --verbose
      Currency exchange rates from www.timegenie.com on 2016-06-21 
      2926 units, 109 prefixes, 88 nonlinear units
      
      You have: liter
      You want: gallon
          liter = 0.26417205 gallon
          liter = (1 / 3.7854118) gallon
      
  • # Merci de la découverte

    Posté par (page perso) . Évalué à 8.

    Je vais tester pour remplacer l'habituel bc -l que j'utilisais jusqu'alors.

    En plus, le fichier de données est bien documenté, ce qui ne gâche rien !

    oldpoint                1|72.27 inch      # The American point was invented
    printerspoint           oldpoint          # by Nelson Hawks in 1879 and
    texpoint                oldpoint          # dominates USA publishing.
                                              # It was standardized by the American
                                              # Typefounders Association at the
                                              # value of 0.013837 inches exactly.
                                              # Knuth uses the approximation given
                                              # here (which is very close).  The
                                              # comp.fonts FAQ claims that this
                                              # value is supposed to be 1|12 of a
                                              # pica where 83 picas is equal to 35
                                              # cm.  But this value differs from
                                              # the standard.
    texscaledpoint          1|65536 texpoint  # The TeX typesetting system uses
    texsp                   texscaledpoint    # this for all computations.
    computerpoint           1|72 inch         # The American point was rounded
    point                   computerpoint
    computerpica            12 computerpoint  # to an even 1|72 inch by computer
    postscriptpoint         computerpoint     # people at some point.
    pspoint                 postscriptpoint
    twip                    1|20 point        # TWentieth of an Imperial Point
    Q                       1|4 mm            # Used in Japanese phototypesetting
                                              # Q is for quarter
    
  • # Pratique!

    Posté par . Évalué à 9.

    Outil très intéressant, je ne connaissais pas! Ça va me faciliter la vie pour calculer l'heure de mes rendez-vous en kiloélectron-volts par Mégawatt.

    You have: hours
    You want: keV/MW
    * 2.2469433e+25
    / 4.4504906e-26

  • # Un truc similaire pour le python.

    Posté par . Évalué à 5.

    http://docs.astropy.org/en/stable/units/

    Je ne comprend pas pourquoi ce n'est pas dans scipy mais bon c'est plutot sympa comme module.

    • [^] # Re: Un truc similaire pour le python.

      Posté par . Évalué à 1. Dernière modification le 27/03/17 à 13:18.

      Je connaissais pint du coup j'ai un peu essayé, et ca semble ne pas bien fonctionner pour tout.

          import astropy.units
          astropy.units.Quantity(10, "deg_C").to("K")
          Exception: UnitConversionError: 'deg_C' (temperature) and 'K' (temperature) are not convertible
      
          import pint
          units = pint.UnitRegistry()
          units.Quantity(10, "degC").to("degK")
          Out: <Quantity(283.15, 'kelvin')>
      

      Je n'ai pas trouvé de comparatifs. Mais du coup astropy est peut-être plus spécifique à l'astronomie.

      • [^] # Re: Un truc similaire pour le python.

        Posté par . Évalué à 2. Dernière modification le 27/03/17 à 13:17.

        Je ne suis pas alles dans le code donc je ne suis pas sur du pourquoi mais la facon de faire pour les temperatures:

            astropy.units.Quantity(10, "deg_C").to("K", equivalencies=u.temperature())
            Out: <Quantity 283.15 K>
        

        mais je ne connaissais pas pint merci.

  • # Qalculate!

    Posté par . Évalué à 5.

    J'utilise depuis peu Qalculate! et je trouve ça vraiment bien. C'est également une calculatrice qui gère les unités. Il y une interface graphique et un version en ligne de commande.

  • # Petite précision

    Posté par . Évalué à 1.

    Sympa, typiquement le genre de logiciel qu'on aurait aimé connaître plus tôt.

    Pour certains calculs il faudra peut être penser à revoir la précision :

    $ units --verbose 1GiB GB
            1GiB = 1.0737418 GB
            1GiB = (1 / 0.93132257) GB
    
    $ units --verbose 1GiB GB --digits 15
            1GiB = 1.073741824 GB
            1GiB = (1 / 0.931322574615479) GB
    

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.