Bienvenue sur PEBKAC.fr, le site qui recense les anecdotes où l’on se moque des utilisateurs ne maîtrisant pas l’outil informatique. PEBKAC est un acronyme signifiant « Problem Exists Between Keyboard And Chair ».
Le problème se situe entre la chaise et le clavier : soumettez vos histoires, donnez votre avis !
Ce site n'est pas le site original pebkac.fr. Je publie ici la liste des PEBKAC que j'ai pu sauvegarder avant que le site original ne soit mis hors ligne.
Dans mes jeunes années, pour calculer la valeur absolue d'un nombre, je la calculais la racine de son carré.
En effet, je pensais que c'était plus rapide que d'utiliser une condition. PEBKAC.
PEBKAC #6786 proposé par ProgVal le 28/01/2013 | 25 commentaires | 👍🏽 👎🏽 +167
rappel : auto-pebkac = BEDP
Commentaire #76052 écrit par achille le 28/01/2013 à 08h44 | 👍🏽 👎🏽
Surtout pour des floats!

Sans utiliser la fonction abs(), tu as pas pensé à un truc du genre

 if(x > 0)
   xAbs = x;
 else
   xAbs = -x;



Ça me fait penser à un collègue qui utilisait la fonction pow() pour faire des décalages de bits. Me demandez pas comment, mais il arrivait à un résultat correct.
Commentaire #76053 écrit par Link le 28/01/2013 à 08h44 | 👍🏽 👎🏽
Pour les entiers : http://graphics.stanford.edu/~seander/bithacks.html#IntegerAbs
Commentaire #76058 écrit par BSK le 28/01/2013 à 08h54 | 👍🏽 👎🏽
xabs = (x>0) ? x : -x;

quand tu fais un abs, tu dois regarder le signe de la valeur. En faisant sqrt(x*x), tu fais une sorte de linéarisation , x carré est forcement positif donc pas de problèmes pour faire la racine carrée
Commentaire #76061 écrit par achille le 28/01/2013 à 08h58 | 👍🏽 👎🏽
un décalage de n bits correspond à une multiplication ou une division par 2 puissance n
Commentaire #76062 écrit par achille le 28/01/2013 à 08h59 | 👍🏽 👎🏽
Bah en l'absence d'une fonction abs() (hypothèse puisqu'on ne connaît pas le langage en question), perso je trouve ça pas si con (mais seulement si on parle d'entiers, sur des float on doit perdre en précision), et plus compact qu'un test if/else.

D'ailleurs, sur la TI-89, taper √(x²) renvoie bien |x|
Commentaire #76072 écrit par ZK456 le 28/01/2013 à 09h47 | 👍🏽 👎🏽
Il ne faisait apparemment pas de multiplication ou division, directement un xdecale = pow(x, n)
Commentaire #76089 écrit par Link le 28/01/2013 à 10h50 | 👍🏽 👎🏽
Je vois quand même un gros problème, en imaginant un int standard sur 32 bits, le carré provoquerait un oveflow dès 46341, qui se traduirait de la manière suivante :
46341^2 = 2147488281, soit en binaire 10000000000000000001001000011001. Donc, pour un integer sur 32 bits, ça donne le résultat suivant :
46341^2 = -2147479015

Je n'ai pas essayé le sqrt sur un nombre négatif, mais à mon avis ce n'est pas beau à voir.
Commentaire #76090 écrit par FBM le 28/01/2013 à 10h52 | 👍🏽 👎🏽
"Plus compact qu'un test if/else"

Peut-être au niveau du code, mais il faut peut-être rappeler que le processeur ne sait pas faire de x² nativement. Ça se traduit par plusieurs multiplications.

Faire faire au processeur plusieurs multiplications (qui prennent pas mal de temps), et en plus avoir un overflow très rapidement (cf mon post au dessus), au lieu d'une simple comparaison qui prend 1 cycle suivie d'une éventuelle affectation du complément à 2 (qui prend 1 cycle également, en fonction de l'affectation, c'est quelques cycles en plus), ce n'est vraiment pas une bonne idée.
Commentaire #76094 écrit par FBM le 28/01/2013 à 10h56 | 👍🏽 👎🏽
yep je parlais plus d'un point de vue théorique. après l'informatique à ses limites
Commentaire #76097 écrit par achille le 28/01/2013 à 11h13 | 👍🏽 👎🏽
Et pour la racine carrée, je ne pense pas qu'un processeur sache le faire nativement non plus. Ca doit surement impliquer quelques divisions, qui sont des opérations très lourdes pour un processeur (plus que les multiplications si mes souvenirs sont bons).
Commentaire #76111 écrit par Acorah le 28/01/2013 à 12h09 | 👍🏽 👎🏽
Tout à fait Acorah, la division est une opération plus complexe que la multiplication pour un processeur.

Toutefois, la majorité des processeurs actuels ont une ALU qui fait des divisions aussi rapidement que des multiplications.
Commentaire #76127 écrit par FBM le 28/01/2013 à 12h50 | 👍🏽 👎🏽
Exact, mais j'ai pas dit que c'était plus rapide, simplement plus compact (en parlant du code). Et pour le calcul de la racine carrée, je ne sais pas si c'est standardisé ou si chacun fait à sa sauce, mais si on part sur l'hypothèse de divisions successives, alors à mon avis on utilise ça:
https://fr.wikipedia.org/wiki/Fraction_continue_d%27un_irrationnel_qua[...]

En plus de permettre le calcul des racines carrées, ça a un nom qui en jette quand tu claque ça au détour d'une conversation :D
Commentaire #76134 écrit par ZK456 le 28/01/2013 à 13h18 | 👍🏽 👎🏽
int pow(int x, int n)
 {
      if(n=0)
           x<<0;
      else if(n=1)
           x<<1;
      else if(n=2)
           x<<2;
      else if(n=3)
           x<<3;
      
      ...
      
      return x;
 }
Commentaire #76140 écrit par Moot le 28/01/2013 à 13h37 | 👍🏽 👎🏽
L'overflow sur le carré ne retourne pas un truc du genre NaN ? Du coup le programme ne devrait même pas essayer de faire le moindre calcul avec et déclencher une erreur, non ?
Commentaire #76164 écrit par Acorah le 28/01/2013 à 14h53 | 👍🏽 👎🏽
Acorah > sur un float, certainement, mais là on parlait uniquement du cas des entiers.
Commentaire #76165 écrit par FBM le 28/01/2013 à 14h55 | 👍🏽 👎🏽
Oui, mais que ce soit avec la racine du carré ou avec la condition, c'est faux puisque ça ne marche pas avec les nombres complexes.
Commentaire #76201 écrit par Pycpp le 28/01/2013 à 17h49 | 👍🏽 👎🏽
@Moot

Ile censé faire quoi ton code ?
1) x<<y ça fait une opération dans le vide, il faut réaffecter le résultat à x.
2) Au lieu d'écrire des if et else if à l'infini, tu ferais mieux de faire directement x = x << n;
3) Ton code est faux, il ne fonctionne que si x est une puissance de 2. Exemple : 5^3 = 125. Mais 5 = 101b, 125=1111101b.

Heureusement que ce n'est pas un entretien d'embauche ;)
Commentaire #76205 écrit par FBM le 28/01/2013 à 17h58 | 👍🏽 👎🏽
J'en rajoute :
4) Même pour les puissances de 2, ton code est faux. Il faudrait :
if (n == 0)
return 1;
else
return x << (n - 1);
Commentaire #76206 écrit par FBM le 28/01/2013 à 17h59 | 👍🏽 👎🏽
J'espère que c'est un troll.

Dans le doute:
1) Si le langage n'a pas de fonction "valeur absolue", il n'aura certainement pas de fonction "carré", et encore moins de fonction "racine".
2) Du point de vue performance, faire deux opérations lourdes au lieu d'un test et d'une inversion de signe est catastrophique.
3) Si c'est juste une question de compacité du code, le mieux est d'écrire la fonction/macro dans une bibliothèque perso et de simplement l'appeler dans le code.
4) Entre x = racine(x * x) et si (x < 0) x = -x on est kif-kif niveau compacité du code.
Commentaire #76264 écrit par Shirluban le 28/01/2013 à 21h51 | 👍🏽 👎🏽
et personne n'a pense a clearer le bit de poid fort ?
Commentaire #76294 écrit par Carbon le 29/01/2013 à 05h42 | 👍🏽 👎🏽
Faites entrer le poney xD
Commentaire #76303 écrit par Muphins le 29/01/2013 à 08h19 | 👍🏽 👎🏽
Pour le calcul de racine carré l'algo utilisé dans les calculatrices est la méthode de Héron, qui fournit une convergence assez rapide:
https://fr.wikipedia.org/wiki/M%C3%A9thode_de_H%C3%A9ron
Commentaire #76317 écrit par metalhysteria le 29/01/2013 à 09h41 | 👍🏽 👎🏽
J'espère que personne n'y a pensé, effectivement, car tous les processeurs (sauf peut-être 1 ou 2 exceptions) utilisent le complément à 2.
Commentaire #76324 écrit par FBM le 29/01/2013 à 10h39 | 👍🏽 👎🏽
J'espère que vous parlez tous de programmation assembleur parce qu'en n'importe quel langage de 3e génération, il est vraiment préférable de laisser le compilateur choisir la méthode la plus appropriée. Votre code sera plus lisible et il est fort probable que le compilateur fera moins de fautes que vous, le tout pour gagner des clopinettes.

Je vois souvent des gens écrire des trucs bizarres en Java ou .NET pensant que ça va optimiser le code alors que le résultat est, au mieux, le même, au pire, une bombe à retardement.
Commentaire #76660 écrit par Eric D le 30/01/2013 à 22h40 | 👍🏽 👎🏽