Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Round sup en C

9 réponses
Avatar
Stephane
Bonjour,

J'aimerais écrire une petite fonction qui arrondit de façon "souple" en
supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)
140 => 200

J'ai essayé avec ceil() et log10(), mais ça m'arrondit trop haut
(140 me donne 1000 par exemple)

Merci.

9 réponses

Avatar
Lucas Levrel
Le 22 janvier 2014, Stephane a écrit :

J'aimerais écrire une petite fonction qui arrondit de façon "souple" en
supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)
140 => 200

J'ai essayé avec ceil() et log10(), mais ça m'arrondit trop haut
(140 me donne 1000 par exemple)



Il faut que tu définisses plus précisément ce que tu veux. D'une part
parce qu'on ne peut pas deviner ce que tu appelles « arrondi souple »,
d'autre part parce que la solution t'apparaîtra probablement toute seule
quand tu auras formalisé ton besoin.

--
LL
Eν οιδα οτι ουδεν οιδα (Σωκρατης)
Avatar
Olivier Miakinen
Bonjour,

Le 23/01/2014 09:30, Lucas Levrel répondait à Stéphane :

Il faut que tu définisses plus précisément ce que tu veux. D'une part
parce qu'on ne peut pas deviner ce que tu appelles « arrondi souple »,



En effet.

d'autre part parce que la solution t'apparaîtra probablement toute seule
quand tu auras formalisé ton besoin.



Entièrement d'accord.
Avatar
Stephane
Lucas Levrel a écrit :
Le 22 janvier 2014, Stephane a écrit :

J'aimerais écrire une petite fonction qui arrondit de façon "souple"
en supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)
140 => 200

J'ai essayé avec ceil() et log10(), mais ça m'arrondit trop haut
(140 me donne 1000 par exemple)



Il faut que tu définisses plus précisément ce que tu veux. D'une part
parce qu'on ne peut pas deviner ce que tu appelles « arrondi souple »,
d'autre part parce que la solution t'apparaîtra probablement toute seule
quand tu auras formalisé ton besoin.



Résultats identiques/similaires à l'exemple que j'ai mis ou
"roundUpNice" de ce thread, mais pas pu conveetir en C:

http://stackoverflow.com/questions/6461209/how-to-round-up-to-the-nearest-10-or-100-or-x
Avatar
Olivier Miakinen
Le 23/01/2014 09:47, Stephane a écrit :

J'aimerais écrire une petite fonction qui arrondit de façon "souple"
en supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)
140 => 200



Il faut que tu définisses plus précisément ce que tu veux.



Résultats identiques/similaires à l'exemple que j'ai mis ou
"roundUpNice" de ce thread, mais pas pu conveetir en C:

http://stackoverflow.com/questions/6461209/how-to-round-up-to-the-nearest-10-or-100-or-x



Alors je vais essayer de formaliser, tu nous diras si c'est ça.

1) si tous les chiffres sauf le premier sont à 0, remplacer
le premier chiffre par la séquence de deux chiffres 10
5 => 10
20 => 100
100 => 1000
9000 => 10000

2) sinon, remplacer le premier chiffre par son successeur, et
tous les autres par 0
21 => 30
29 => 30
101 => 200
199 => 200
221 => 300
917 => 1000

C'est ce qui me semble le plus proche de ta demande. Malgré tout, ça
donne des résultats que, personnellement, je trouve peu intuitifs.
Par exemple :

99 => 100
100 => 1000
101 => 200
...
199 => 200
200 => 1000
201 => 300
...
299 => 300
300 => 1000
301 => 400
...

Cordialement,
--
Olivier Miakinen
Avatar
Samuel DEVULDER
Le 22/01/2014 18:34, Stephane a écrit :
Bonjour,

J'aimerais écrire une petite fonction qui arrondit de façon "souple" en
supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)



pourquoi 50 ? 20 est 4 fois plus grand que 5 lequel est arrondi à 10.
Aussi par homogénéité, j'arrondirais 20 à 4*10 = 40. Qu'est ce qui ne va
pas à ce 40 pour que tu lui préfères 50 ?

140 => 200



De même 140 = 28*5, donc pourquoi ne pas arrondir à 28*10 ?

C'est quoi ton arrondi "souple" au juste ? Qu'est ce qui décide qu'il
faut arrondir à 50 et pas à 40, ou à 200 et pas 280 ?

J'ai essayé avec ceil() et log10(), mais ça m'arrondit trop haut
(140 me donne 1000 par exemple)



Pourquoi 1000 est trop haut ? Quel critère utilises tu ?
Avatar
Samuel DEVULDER
Le 23/01/2014 09:47, Stephane a écrit :

Résultats identiques/similaires à l'exemple que j'ai mis ou
"roundUpNice" de ce thread, mais pas pu conveetir en C:

http://stackoverflow.com/questions/6461209/how-to-round-up-to-the-nearest-10-or-100-or-x



Ok je comprends, tu as un nombre x, tu veux trouver le nombre y = a*10^b
minimal tel que x<=y, et a dans l'ensemble (1, 2, 4, 5, 6, 7, 8). (a
est exclus de la définition car en prennant un b plus grand de 1 unité
et a on revient au même.)

Essaye de voir ce que donne le code:

int roundUpNice(int x) {
static int a[] = {1,2,4,5,6,7,8,10};
// par contre 10 sert ici de sentinelle

int dix_puissance_b = 1, i;

if(x<=0) return x; // oui bon, ou autre chose.

while(x<*dix_puissance_b) dix_puissance_b *= 10;
// ici on a forcément n sortie
dix_puissance_b<x<*dix_puissance_b

for(i=0; a[i]*dix_puissance_b < x; ++i);
// on ne peut pas déborder le tableau de 'a' parce que
x<*dix_puissance_b

return a[i]*dix_puissance_b; // resultat attendu
}
Avatar
Samuel DEVULDER
Le 23/01/2014 09:47, Stephane a écrit :

Résultats identiques/similaires à l'exemple que j'ai mis ou
"roundUpNice" de ce thread, mais pas pu conveetir en C:

http://stackoverflow.com/questions/6461209/how-to-round-up-to-the-nearest-10-or-100-or-x



Ok je comprends, tu as un nombre x, tu veux trouver le nombre y = a*10^b
minimal tel que x<=y, et a dans l'ensemble (1, 2, 4, 5, 6, 7, 8). (a
est exclus de la définition car en prennant un b plus grand de 1 unité
et a on revient au même.)

Essaye de voir ce que donne le code:

int roundUpNice(int x) {
static int a[] = {1,2,4,5,6,7,8,10};
// par contre 10 sert ici de sentinelle

int dix_puissance_b = 1, i;

if(x<=1) return x; // oui bon, ou autre chose.

while(10*dix_puissance_b<x) dix_puissance_b *= 10;
// ici on a forcément en sortie dix_puissance_b < x <=
10*dix_puissance_b

for(i=0; a[i]*dix_puissance_b < x; ++i);
// on ne peut pas déborder le tableau 'a' parce que x <=
10*dix_puissance_b (cf la sentinelle).

return a[i]*dix_puissance_b; // resultat attendu
}

sam.
Avatar
Samuel DEVULDER
Le 23/01/2014 22:14, Samuel DEVULDER a écrit :

int roundUpNice(int x) {
static int a[] = {1,2,4,5,6,7,8,10};



J'avoue que je me demande ce qu'ont de "nice" ces valeurs pour 'a'. On
exclue 3 alors que je le trouve très joli ce 3. Bon passons :)

int dix_puissance_b = 1, i;

if(x<=1) return x; // oui bon, ou autre chose.



x<=0 irait aussi car la valeur x=1 est arrondie en 1 dans la suite de
l'algo. Ce test est surtout là pour donner un sens au "roundup" de
valeurs négatives. Par symétrie on pourrait définir ainsi l'arrondi pour
toutes les valeurs positives, négatives ou nulles.

int roundUpNiceSymetric(int x) {
return x==0 ? 0 : x>0 ? roundUpNice(x) : -roundUpNice(-x);
}

Mais ca n'est plus tout a fait un arrondi "par le dessus". On doit
pouvoir adapter l'algo pour les cas négatifs en inversant le signe de
dix_puissance_b ainsi que le sens des comparaisons, mais je suis trop
flemard pour détailler ce point qui n'apporte rien sauf alourdir un algo
qui se veut simple.

sam.
Avatar
pvluchenko
Le mercredi 22 Janvier 2014 à 18:34 par Stephane :
Bonjour,

J'aimerais écrire une petite fonction qui arrondit de façon
"souple" en
supérieur.
Par ex :
5 => 10
20 => 50 (voire 100)
140 => 200

J'ai essayé avec ceil() et log10(), mais ça m'arrondit trop haut
(140 me donne 1000 par exemple)

Merci.


bjr chers membres. j'ai un projet d'un jeu tetris. seulement je compte remplacer les blocs par des lettres du genre N-C-O-H. car je compte plutôt construire des molécules chimiques, et avec leurs différentes liaisons, aussi le programme doit être capable de donner le nom de la molécule après l'avoir construit. je sais que je devrais introduire toutes les combinaisons moléculaires. je voudrais le faire en langage c mais seulement je n'arrive pas encore à savoir comment m'y prendre pourtant je connais le programme du tetris normal. ok je vous pris de m'aider même avec ne serait-ce qu'un brainstorming