Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/02/2015, à 19:01

NY152

[RESOLU] Boucle avec un nombre non-entier :/

Bonjour,

J'aimerais pouvoir faire une boucle qui teste si une valeur est egal par exemple à 0.080 et si ce n'est pas le cas, incrémenter ou décrémenter une variable. Seulement en bash, je ne sais le faire qu'avec des entiers.

En gros si je fais ça, ça coince ça me demande des entiers :

until [ "$a" -eq 0.080 ]; do
if [ "$a" -lt 0.080 ]
then
$b++
else
$b--
fi
done 

Quelqu'un saurait adapter cette boucle avec des nombres non-entiers (voire négatifs) ?

D'avance, merci

Dernière modification par NY152 (Le 27/02/2015, à 11:21)

Hors ligne

#2 Le 24/02/2015, à 20:54

Sciensous

Re : [RESOLU] Boucle avec un nombre non-entier :/

le shell ne gère directement que les entiers; pour les réels, il faut utiliser un pipe avec la commande bc:

echo "0.8+0.1" | bc

ou contourner en multipliant par un multiple de 10 smile
1000x0.080=80

Dernière modification par Sciensous (Le 24/02/2015, à 20:55)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#3 Le 24/02/2015, à 21:19

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

En gros ma boucle est impossile si je suis ton résonnement ...

Ta commande permet de faire un calcul, ça peut servir mais si je veux tester un non-entier, c'est fichu donc ?

Hors ligne

#4 Le 24/02/2015, à 21:49

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

Bonsoir,
Tu peux utiliser bc pour faire le test, qui te renverra 0 pour faux et 1 pour vrai.

until [ $(bc <<<"$a==0.080") = 1 ]; do
   if [ $(bc <<<"$a<0.080") = 1 ]
   then
      ((b++))
   else
      ((b--))
   fi
done 

Tu risques de ne jamais sortir de la boucle si la variable a n'y est pas modifiée.

Hors ligne

#5 Le 24/02/2015, à 22:18

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

Ca ne marche pas chez moi :

/home/ny152/test.sh: ligne 3 : [: = : opérateur unaire attendu
(standard_in) 1: syntax error
/home/ny152/test.sh: ligne 4 : [: = : opérateur unaire attendu

Hors ligne

#6 Le 24/02/2015, à 22:29

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

La variable a est-elle définie ?
Si oui, montre ton script exact.

Hors ligne

#7 Le 25/02/2015, à 18:31

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

En fait je tente de calculer le bitrate d'une vidéo en tenant compte le bit/pixel de 0.076 pour une vidéo 1080p et obtenir un "HDLight" de bonne qualité.

Donc j'ai écris ceci :

        #Je mets un bitrate de départ pour éviter les division par 0
        bitrate=100
        echo -n "Largeur de la vidéo : "
            read largeur
        echo -n "Hauteur de la vidéo : "
            read hauteur
        echo -n "Image par seconde : "
            read ips
        BitPerPixel=$((($largeur*$hauteur*$ips)/(bitrate*1024)))
        until [ $(bc <<<"$BitPerPixel==0.076") = 1 ]; do
        if [ $(bc <<<"$BitPerPixel<0.076") = 1 ]; then
            ((bitrate++))
            BitPerPixel=$((($largeur*$hauteur*$ips)/($bitrate*1024)))
        else
            ((bitrate--))
            BitPerPixel=$((($largeur*$hauteur*$ips)/($bitrate*1024)))
        fi
        done
        echo $bitrate et $BitPerPixel

Ce script ne fonctionne pas. Si quelqu'un peut le rendre opérationnel ... ^^

Hors ligne

#8 Le 25/02/2015, à 19:10

Rufus T. Firefly

Re : [RESOLU] Boucle avec un nombre non-entier :/

Salut,

Ta valeur de référence est décimale, 0.076. (non-entier, ça peut être des tas de choses, comme pi par exemple)
Au lieu de comparer BitPerPixel à 0.076, tu peux créer une variable auxiliaire égale à 1000 x BitPerPixel et la comparer à 76.
A mon avis, c'est beaucoup plus simple et probablement plus rapide que de passer par bc...

Dernière modification par Rufus T. Firefly (Le 25/02/2015, à 19:14)


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#9 Le 25/02/2015, à 19:13

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

Quelques remarques :

  1. Si BitPerPixel<0.076, tu augmentes bitrate, ce qui diminue BitPerPixel. Le test est sans doute à l'envers.

  2. BitPerPixel=$((($largeur*$hauteur*$ips)/($bitrate*1024)))

    Tu fais ici une division entière, sans doute pas ce que tu veux.

  3. Pourquoi ne pas calculer bitrate ainsi :

    BitPerPixel=0.076
    bitrate=$(bc -l <<<"$largeur*$hauteur*$ips/($BitPerPixel*1024)")

Hors ligne

#10 Le 25/02/2015, à 20:30

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

Pour la formule de calcul du bitrate (x264), j'ai repris exactement celle d'un tuto qui donnait de bons résultats.

Je test la formule en condition réelle et je regarde ce que ça donne. ^^

Hors ligne

#11 Le 25/02/2015, à 20:41

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

oups ....

(standard_in) 1: syntax error

EDIT : Autant pour moi, erreur de frappe mais la formule n'est pas bonne ; Ça me sort un bitrate gigantesque hmm

Dernière modification par NY152 (Le 25/02/2015, à 20:47)

Hors ligne

#12 Le 25/02/2015, à 20:52

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

Tu as dû oublier de définir une variable. Fais un copier-coller des commandes que tu lances, et du message.

Hors ligne

#13 Le 25/02/2015, à 21:15

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

C'est bon le calcul se déroule bien mais le résultat est irréaliste donc c'est pas bon.

Hors ligne

#14 Le 25/02/2015, à 21:23

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

As-tu vérifié le calcul à la main ?

echo $largeur $hauteur $ips $BitPerPixel $bitrate

Hors ligne

#15 Le 25/02/2015, à 21:38

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

Les valeurs sont bonnes ; Seule le bitrate est érronné !

J'obtiens 799342.10526315789473684210 là où je devrais trouver 4728 avec la formule que j'ai exposé plus haut.

Hors ligne

#16 Le 25/02/2015, à 21:48

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

Peux-tu donner le résultat de la commande en #14 ?

Hors ligne

#17 Le 25/02/2015, à 21:50

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

1920 1080 30 799342.10526315789473684210

Hors ligne

#18 Le 25/02/2015, à 22:02

pingouinux

Re : [RESOLU] Boucle avec un nombre non-entier :/

Le calcul s'effectue correctement à partir des valeurs que tu donnes. Pour trouver bitrate=4728, il faudrait que BitPerPixel=12.85.

Hors ligne

#19 Le 25/02/2015, à 22:13

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

Ben oui c'est ce que je dis la formule est pas bonne. Ce calcul est faite avec

bitrate=$(bc -l <<<"$largeur*$hauteur*$ips/($BitPerPixel*1024)")

Alors que la formule qui fonctionne (pas dans ce script lol)

BitPerPixel=$((($largeur*$hauteur*$ips)/($bitrate*1024)))

Hors ligne

#20 Le 25/02/2015, à 22:35

Sciensous

Re : [RESOLU] Boucle avec un nombre non-entier :/

je ne comprends pas un truc: dans ton script, BitPerPixel est forcément entier or il doit valoir 12,85 et tu donnes 799342.10526315789473684210 soit des réels...

Dernière modification par Sciensous (Le 25/02/2015, à 22:36)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#21 Le 25/02/2015, à 22:57

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

Sur cette page on parle de l'encodage basé sur le Bit/Pixel. Y a même un lien vers une calculatrice (Programme Windows en VB à priori)

http://www.repaire.net/forums/compressi … ideal.html

J'ai perdu la page où j'avais trouvé la formule. Je cherche et je te la passe.

Hors ligne

#22 Le 25/02/2015, à 23:06

Sciensous

Re : [RESOLU] Boucle avec un nombre non-entier :/

peux-tu mettre ta dernière version de script ?
(je ne comprends pas le BitPerPixel comme je te l'ai dit)
ne préfères-tu pas faire les tests avec des entiers comme suggéré 2x ?
(test sur 0.076 --> ramené à 76 en x1000)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#23 Le 25/02/2015, à 23:46

NY152

Re : [RESOLU] Boucle avec un nombre non-entier :/

La dernière version de mon script je l'ai déjà donné sauf que j'essaie avec la seconde formule du poste #19

Avec des entiers pourquoi pas mais ça changerait quoi ? Eviter l'utilisation de bc déjà mais après ?

Hors ligne

#24 Le 25/02/2015, à 23:50

Rufus T. Firefly

Re : [RESOLU] Boucle avec un nombre non-entier :/

Au lieu de "Boucle avec un nombre non-entier", tu auras "Boucle avec un nombre entier" donc un problème tout ce qu'il y a de plus classique. A toi d'écrire la routine correcte...


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#25 Le 25/02/2015, à 23:54

Sciensous

Re : [RESOLU] Boucle avec un nombre non-entier :/

les entiers: pour simplifier et la rapidité;

certes je suis fatigué, mais je ne vois pas comment avec le script plus haut tu peux avoir un BitPerPixel non entier !!
(je me répète...)
je rappelle qu'une division sans passer par bc ne donne que des entiers.


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne