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.

#126 Le 02/03/2011, à 21:43

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

@Rolinh : Je pensais que le nom de la fonction était assez explicite : la fonction renvoie la première puissance de 2 supérieure au nombre passé en paramètre.
Pour le code complet, bah pour le test c'était juste un main avec un printf comme tu l'as fait. Non, il n'y a pas de valeurs particulières pour le test.
Sinon le résultat obtenu est bien celui attendu, donc c'est bon ça fonctionne bien comme prévu smile

Pour le contexte, c'est plus ou moins la suite de mon post en haut de cette page (ma première tentative ^^).
En fait c'est pour la construction de ma table de hachage : je prend une taille en 2^n (comme ça je peut utiliser 0,5 pour c1 et c2 dans ma sonde quadratique pour avoir des résultats pas trop mauvais).
Je pourrais avoir des résultats sûrement meilleurs en prenant une taille en nombre premier, mais c'est un peu plus chiant à mettre en place (et comme je l'ai dit, je suis déjà en manque de temps et ma table ne devrait pas atteindre une taille énorme).

Merci de ton retour smile



@Pylade : Ok, normalement ça devrait fonctionner chez toi aussi (ou alors je suis vraiment passé à côté d'un truc, ce qui est possible vu que je faisait ça pendant un cours ^^)

Dernière modification par grim7reaper (Le 02/03/2011, à 21:46)

Hors ligne

#127 Le 02/03/2011, à 21:52

Rolinh

Re : /* Topic des codeurs couche-tard [4] */

grim7reaper a écrit :

@Rolinh : Je pensais que le nom de la fonction était assez explicite : la fonction renvoie la première puissance de 2 supérieure au nombre passé en paramètre.

Voui, je m'en étais douté ^^
La question était plus dans le sens: "dans quel but/contexte" et est-ce partie intégrante d'autre chose etc. mais tu as répondu à ces questions wink

grim7reaper a écrit :

Merci de ton retour smile

De rien wink

Hors ligne

#128 Le 02/03/2011, à 22:03

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Euh, je suis le seul à être choqué par le truc suivant ?

if(n =! 0)
{
  …
}
else
  n = 0;

“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#129 Le 02/03/2011, à 22:06

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Ouais en effet, le else est totalement inutile.
Mais bon, j'ai fait ça en suivant un cours en parallèle donc bon j'était pas non plus super attentif ^^

Dernière modification par grim7reaper (Le 02/03/2011, à 22:08)

Hors ligne

#130 Le 02/03/2011, à 22:09

Rolinh

Re : /* Topic des codeurs couche-tard [4] */

lol je n'y avais même pas fait gaffe ^^

Hors ligne

#131 Le 02/03/2011, à 22:19

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Voici le code que j'ai testé (oui j'ai changé le type car pour un test il n'y a pas de raisons d'avoir de size_t ; et puis ça évite un cast dans le printf) :

#include <stdio.h>
#include <limits.h>

static unsigned long next_highest_power_of_2(unsigned long n)
{
    if(n)
    {
        unsigned long i;

        --n;
        for(i = 1; i < sizeof n * CHAR_BIT; i <<= 1)
            n |= n >> i;
        ++n;
    }

    return n;
}

int main(void)
{
    printf("%lu\n", next_highest_power_of_2(3436357648732626854U));
    return 0;
}

Le résultat est bien celui attendu : 4611686018427387904. smile

Et on a bien 9223372036854775808 pour 5436357648732626854U.

Dernière modification par Pylade (Le 02/03/2011, à 22:22)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#132 Le 02/03/2011, à 22:25

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

\o/

Merci de ton test smile
(Ptain le coup du else, c'était la lose quand même ^^)

Hors ligne

#133 Le 02/03/2011, à 22:37

tshirtman

Hors ligne

#134 Le 02/03/2011, à 22:40

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Si, c'est pareil.

Dernière modification par grim7reaper (Le 02/03/2011, à 22:40)

Hors ligne

#135 Le 02/03/2011, à 22:44

tshirtman

Re : /* Topic des codeurs couche-tard [4] */

ah oui, je viens de voir que pylade avait fait le changement aussi smile

Hors ligne

#136 Le 02/03/2011, à 22:49

tshirtman

Re : /* Topic des codeurs couche-tard [4] */

@T'Man : Tiens d'ailleurs, c'est VS 2010 Ultimate obligatoire dans mon cours... [ah ben faut bien que ça serve le MSDNAA de l'école <_<' ] sad exit vim/Mono! hmm
Pourtant j'étais parti pour essayer.. Mais nooon, je l'ai bien profond! mad

hmmm… bon courage?

franchement moi je m'en foutrais de ce qu'ils imposent, je bosse sur ma machine s'il le faut, mais je bosse comme je veux.

(bon, je suppose qu'il faut rendre un fichier de projet visual studio, et s'assurer que ça compile dessus, mais monodevelop sait faire)

Hors ligne

#137 Le 02/03/2011, à 23:00

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Ptain, faut vraiment que je nettoie mon code…
Parce que si le prof (ou quelqu'un d'autre) tombe là-dessus, il risque de se poser des questions

[…]
fputs("Fuck that! That one has a Mana bar!\n", stderr);
[…]
fputs("All your base are belong to us\n", stderr);
[…]
fputs("Herp Derp!\n", stderr);
[…]
fputs("The consequences will never be the same\n", stderr);
[…]
fputs("The cake is a lie!!\n", stderr)

Dernière modification par grim7reaper (Le 02/03/2011, à 23:01)

Hors ligne

#138 Le 02/03/2011, à 23:15

Pylades

Re : /* Topic des codeurs couche-tard [4] */

big_smile


Tiens, j'ai fait une version avec laquelle je suis plus rapide que toi pour les grands nombres.

unsigned long next_highest_power_of_2(unsigned long n)
{
    unsigned long i;
    for (i = ULONG_MAX/2+1; i; i>>=1)
        if (i < n)
            return i<<1;
    return 1U;
}

(Ouais, l'initialisation de ma boucle n'est pas super élégante.)
(Et oui, moi je retourne un quand on me donne zéro, car zéro n'est pas une puissance de deux.)

Dernière modification par Pylade (Le 02/03/2011, à 23:16)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#139 Le 02/03/2011, à 23:49

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Mouais bof. C'est loin d'être meilleur (sauf cas particuliers, donc bof quoi).

Sur un 1UL en 64 bits,  tu vas bouffer 64 itérations. Moi en 6 itérations c'est plié, et pour n'importe quel nombre en 64 bits.
Mon algo a un nombre d'itérations constant : log2(nombre de bits), et ça c'est classe.


Sur 32 bits, tu deviens meilleur que moi à partir de 268 435 457.
Si j'applique ton algo de 0 à UCHAR_MAX (8 bits) tu fais 6 661 itérations, moi 765.
Si j'applique ton algo de 0 à USHRT_MAX (16 bits) tu fais 1 179 661, moi 262 140.

Le choix est vite vu big_smile

Et cerise sur le gâteau : je peux rendre mon code générique (moyennant l'ajout de quelques contraintes sur la localisation de son utilisation, je l'admet mais rien n'est parfait) en le « templatisant » (non, je n'utilise pas le C++, je reste en C), toi non (vu que tu utilises ULONG_MAX dans tout les cas) tongue


Sinon moi je retourne 0 car si le mec m'a passé une taille de 0, bah ça reste 0 (mais sinon, dans l'absolu je suis d'accord avec ton retour de 1).

Dernière modification par grim7reaper (Le 03/03/2011, à 00:07)

Hors ligne

#140 Le 03/03/2011, à 00:04

Kanor

Re : /* Topic des codeurs couche-tard [4] */

grim7reaper a écrit :

Ptain, faut vraiment que je nettoie mon code…
Parce que si le prof (ou quelqu'un d'autre) tombe là-dessus, il risque de se poser des questions

[…]
fputs("Fuck that! That one has a Mana bar!\n", stderr);
[…]
fputs("All your base are belong to us\n", stderr);
[…]
fputs("Herp Derp!\n", stderr);
[…]
fputs("The consequences will never be the same\n", stderr);
[…]
fputs("The cake is a lie!!\n", stderr)

Moi je résiste pour ne pas écrire des commentaires trop "vulgaire"

Hors ligne

#141 Le 03/03/2011, à 00:20

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Ouais, le gain est plus flagrant en 64 bits…

Mais je ne suis pas obligé d'utiliser ULONG_MAX/2+1 ; je peux aussi très bien faire 1 << (sizeof i * CHAR_BIT - 1). tongue

Dernière modification par Pylade (Le 03/03/2011, à 00:43)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#142 Le 03/03/2011, à 00:28

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Ouais, et là tu pourras « templatiser » ton code.
Bon, ça resteras une daube dans le cas général tongue (cf. mes tests), mais ça sera un peu mieux quand même.

Avec du code « templatisé » tu peux ecrire des trucs comme ça :

generic_next_highest_power_of_2(unsigned short, 777);
generic_next_highest_power_of_2(unsigned, 131030U);
generic_next_highest_power_of_2(unsigned long, 4398046511062UL);

Tiens, faudra que je ponde un article là dessus (je vois bien le truc en 3 parties : approche naïve, optimisation, généricité).

Dernière modification par grim7reaper (Le 03/03/2011, à 00:33)

Hors ligne

#143 Le 03/03/2011, à 00:32

Pylades

Re : /* Topic des codeurs couche-tard [4] */

What?! yikes


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#144 Le 03/03/2011, à 00:39

grim7reaper

Re : /* Topic des codeurs couche-tard [4] */

Le C, c'est beau et puissant cool
Le C c'est bon, mangez-en cool

Et ça, quasiment sans modifier le code de la fonction.

Bon, ça a aussi des inconvénients hein, faut pas croire. Il n'y a pas de miracles.
Comme je le disais dans un de mes précédents posts ça ajoute quelques contraintes sur la localisation de son utilisation et ce n'est pas applicable à toute les fonctions (enfin si, mais des fois c'est vraiment contre-productif de le faire). Mais bon, en général le prix à payer est faible comparé au gain.



Sur ce, il faut que j'aille un peu préparer mon exam de demain (oral + écrit).

Dernière modification par grim7reaper (Le 03/03/2011, à 00:43)

Hors ligne

#145 Le 03/03/2011, à 00:46

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Ouais, ben je veux bien un article là-dessus ; car là je n'y comprends rien.


(Et puis mon morceau de code n'avait pas pour vocation d'être pertinent, mais juste de me permettre de me la ramener en disant que je suis plus rapide sur les grands nombres. tongue)


Et bonne chance pour demain !

Dernière modification par Pylade (Le 03/03/2011, à 00:46)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#146 Le 03/03/2011, à 00:48

Kanor

Re : /* Topic des codeurs couche-tard [4] */

Maitre du C vous pensez quoi de ce bouquin
http://framabook.org/c20h.html

Hors ligne

#147 Le 03/03/2011, à 00:50

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Ah, oui, je vois : c'est une macro. Ça explique le unsigned long qui se balade tout seul en temps qu'argument…


Kanor a écrit :

Maitre du C vous pensez quoi de ce bouquin
http://framabook.org/c20h.html

Je ne suis pas un maître du C ; et je ne l'ai pas lu, pour ma part… tongue

Dernière modification par Pylade (Le 03/03/2011, à 00:51)


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne

#148 Le 03/03/2011, à 01:22

tshirtman

Re : /* Topic des codeurs couche-tard [4] */

aujourd'hui, quelques articles m'ont donnés envie de me mettre au lisp hmm

Hors ligne

#149 Le 03/03/2011, à 01:23

Кຼزດ

Re : /* Topic des codeurs couche-tard [4] */


dou

Hors ligne

#150 Le 03/03/2011, à 01:33

Pylades

Re : /* Topic des codeurs couche-tard [4] */

Bon, qu'est-ce que je pourrais bien mettre dans mon README ? Grande question…


“Any if-statement is a goto. As are all structured loops.
“And sometimes structure is good. When it’s good, you should use it.
“And sometimes structure is _bad_, and gets into the way, and using a goto is just much clearer.”
                Linus Torvalds – 12 janvier 2003

Hors ligne