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

Arrondis

16 réponses
Avatar
Gamotte
Bonjour,

je voudrais remplacer un fichier par le m=EAme fichier
dans lequel tous les nombres ont =E9t=E9 arrondis =E0 3
chiffres apr=E8s la virgule, l'arrondi =E9tant vers le haut
ou le bas selon celui qui est le plus proche.
Le fichier contient du texte et des nombres diss=E9min=E9s
dans le texte. Je ne peux donc pas utiliser un tableur
et recherche donc une solution du type rechercher/remplacer.

Merci

--
Yves

6 réponses

1 2
Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

2007-03-26, 06:33(+00), Stephane Chazelas:
[...]
en ce cas, on peut faire

perl -pi -e 's/(?<=.)(d{3})(d)d*/$1+($2>=5)/ge'


D'ailleurs, -0.2345 doit-il etre arrondi en -0.234 or -0.235?


En arrondi "rounding to nearest, ties away from zero", -0.2345 doit
être arrondi en -0.235.

Si -0.234:

perl -p -e 's/(-?)(d*.)(d{3})(d)d*/
$1.$2.($3+($4>=(5+($1eq"-"))))/ge'


Dans les deux cas, tu ne tiens pas compte du cas où il y a une retenue
qui doit se propager dans la partie entière, e.g. "1.9999".

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Vincent Lefevre
Dans l'article <4607754e$0$21494$,
Nicolas George <nicolas$ écrit:

Stephane Chazelas wrote in message
:
D'ailleurs, -0.2345 doit-il etre arrondi en -0.234 or -0.235?


-0.234, si on veut quelque chose de logique et régulier.


-0.235 est tout aussi logique et régulier. Cherche "ties away from zero"
sur Google...

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Nicolas George
Vincent Lefevre wrote in message
<20070326090639$:
-0.235 est tout aussi logique et régulier.


Mathématiquement non, puisque ça brise l'invariance par translation.

Avatar
Stephane Chazelas
2007-03-26, 09:03(+00), Vincent Lefevre:
[...]
perl -p -e 's/(-?)(d*.)(d{3})(d)d*/
$1.$2.($3+($4>=(5+($1eq"-"))))/ge'


Dans les deux cas, tu ne tiens pas compte du cas où il y a une retenue
qui doit se propager dans la partie entière, e.g. "1.9999".



Oops, humm.

Sans parler de 1.0123 qui devient 1.12... et 1.1001 qui devient
1.100


$ perl -p -e 's{(-?)(d*).(d{3})(d)d*}{
$1.sprintf("%.3f", (($2.$3)+($4>=(5+($1eq"-"))))/1000)
}ge'
1.1234
1.123
1.1235
1.124
-1.1235
-1.123
1111111111111.1235
1111111111111.124
222222222222222222.1235
222222222222222240.000

Ya toujours des problemes d'arrondi pour des nombres grands,
mais au moins ca reste coherent pour les nombres petits autour
de x.xxx5

--
Stéphane


Avatar
Vincent Lefevre
Dans l'article <46079560$0$19020$,
Nicolas George <nicolas$ écrit:

Vincent Lefevre wrote in message
<20070326090639$:
-0.235 est tout aussi logique et régulier.


Mathématiquement non, puisque ça brise l'invariance par translation.


Tout dépend de ce que tu entends par "régulier". L'invariance par
translation est effectivement brisée, mais on récupère la symétrie
(fonction impaire): rnd(-x) = - rnd(x).

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


Avatar
Vincent Lefevre
Dans l'article ,
Stephane Chazelas écrit:

2007-03-26, 09:03(+00), Vincent Lefevre:
[...]
perl -p -e 's/(-?)(d*.)(d{3})(d)d*/
$1.$2.($3+($4>=(5+($1eq"-"))))/ge'


Dans les deux cas, tu ne tiens pas compte du cas où il y a une retenue
qui doit se propager dans la partie entière, e.g. "1.9999".


Oops, humm.

Sans parler de 1.0123 qui devient 1.12... et 1.1001 qui devient
1.100


Ah, c'était pire que ce que je pensais.

$ perl -p -e 's{(-?)(d*).(d{3})(d)d*}{
$1.sprintf("%.3f", (($2.$3)+($4>=(5+($1eq"-"))))/1000)
}ge'


Ça revient à peu près à la solution que je proposais dans ma réponse
à Alain Ketterlin, sauf que je préfère "ties away from zero" pour
avoir une fonction impaire.

Ya toujours des problemes d'arrondi pour des nombres grands,
mais au moins ca reste coherent pour les nombres petits autour
de x.xxx5


Oui, c'est aussi ce que je disais. Une solution pour des nombres plus
grands est aussi possible, sans avoir recours à de la multiprécision.

Pour info, voici comment on peut incrémenter chaque nombre (considéré
comme entier et sans tenir compte d'un signe éventuel) d'un fichier:

perl -pe 's/(d)(9*)(?!d)/($1+1)."0"x length$2/ge'

Les 0 initiaux éventuels sont conservés (le dernier étant remplacé par
un 1 en cas de retenue). Si on ne veut pas les conserver, je pense que
la solution suivante doit fonctionner:

perl -pe 's/0*(d*?)(d)(9*)(?!d)/$1.($2+1)."0"x length$3/ge'

--
Vincent Lefèvre - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)



1 2