Arrondi et truncature - Informatique de MIA
Transcription
Arrondi et truncature - Informatique de MIA
Arrondi et truncature Fabrice Dessaint Inra, UMR1347 Agroécologie, Dijon Décembre 2015 Cette note présente quelques unes des fonctions de R permettant d’arrondir ou de tronquer un nombre décimal. Les nombres On appelle nombre, une séquence ordonnée d’un ou de plusieurs symboles servant à exprimer les différentes valeurs possibles d’une quantité ou d’une grandeur physique. Selon le système de numération, le nombre de symboles utilisés pour écrire un nombre va varier. Dans le système de numération décimal (ou système en base 10), les symboles utilisés, sont les chiffres de 1 à 9 et le chiffre 0. Dans le système héxadécimal (ou système en base 16), on ajoute aux chiffres précédents, les symboles A, B, C, D, E et F alors que dans le système binaire (ou système en base 2), on n’utilisera que les chiffres 0 et 1. Plus généralement, pour un système en base b, on utilisera donc les chiffres et les lettres de 0 jusqu’à la base b du système de numération, celle-ci étant exclue. La valeur représentée par un nombre est la somme du produit des différents symboles qui le compose par la valeur de leur position dans le nombre. En effet, chaque position dans le nombre a une valeur, tout comme chaque symbole. Ainsi, le nombre 103 écrit en base 4, représente en base 10, la valeur 19 : strtoi("103", 4L) [1] 19 1*4^2 + 0*4^1 + 3*4^0 [1] 19 Ce même nombre, écrit en base 8, correspond (en base 10) à 67 strtoi("103", 8L) [1] 67 1*8^2 + 0*8^1 + 3*8^0 [1] 67 alors que écrit en base 16, il correspond à 259 Dans le nombre 103, le chiffre 3 occupe la première position qui, quelle que soit la base b, a pour valeur b0 = 1. Le chiffre 0 qui est en deuxième place, a pour valeur b1 et le chiffre 1 qui occupe la troisième position, a pour valeur b2 . arrondi et truncature strtoi("103", 16L) [1] 259 1*16^2 + 0*16^1 + 3*16^0 [1] 259 Dans le reste du document, on est en base 10 et on travaille avec des nombres décimaux. Les chiffres significatifs On appelle chiffres significatifs, le nombre minimum de chiffres nécessaires à l’écriture d’un nombre sans perte d’information. Pour définir ce nombre, il existe quelques règles. • tous les chiffres non nuls (1, 2, 3, 4, 5, 6, 7, 8 et 9) sont toujours significatifs 12 345 est un nombre composé de 5 chiffres significatifs ainsi que 1,2345 • tous les 0 (zéro) positionnés entre deux chiffres différents de zéro sont toujours significatifs 10 005 est un nombre avec 5 chiffres significatifs • tous les zéros positionnés à droite du symbole décimale et en fin de nombre sont significatifs 1,0200 est un nombre avec 5 chiffres significatifs, de même que 1,0200 • tous les autres zéros sont des chiffres non significatifs : 1 000 000 est un nombre qui n’a qu’un chiffre significatif (les zéros ne sont là que pour indiquer la position dans le nombre du chiffre 1 : ici il est en 7e position). Le nombre 1 000 000,00 a lui 3 chiffres significatifs : le 1 et les 2 zéros, après le symbole décimal ; 0,0200 est aussi un nombre avec 3 chiffres significatifs : le 2 et les 2 zéros à la fin du nombre. Sous R, c’est la fonction signif() qui permet de faire cette opération. Cette fonction possède 2 arguments : signif(x, digits = 6) Le premier, x=, est obligatoire et indique la valeur que l’on souhaite arrondir. Le second, digits=, est facultatif. Il indique le nombre de chiffres significatifs à conserver. nombre <- c(12345, 1.2345, 10005, 1.0200, 1000.00, 0.0010332) signif(x=nombre, digits=4) [1] 1.234e+04 1.234e+00 1.000e+04 1.020e+00 1.000e+03 1.033e-03 Selon la façon dont le nombre est écrit, le nombre de chiffres significatifs affichés peut varier. Il est alors préférable d’écrire en notation scientifique ou en notation ingénieur, car avec ces notations, par convention, tous les chiffres de la mantisse sont significatifs. On peut aussi fournir un vecteur ou un tableau numérique Par défaut, digits=6 2 arrondi et truncature Les arrondis L’arrondi d’un nombre décimal est une valeur approchée de ce nombre obtenue en réduisant le nombre de chiffres le représentant. Il existe plusieurs façons d’arrondir un nombre. Arrondi au pair le plus proche C’est la méthode utilisée par la fonction round() de R. Cette fonction possède 2 arguments : round(x, digits = 0) Le premier, x=, est obligatoire et indique la valeur que l’on veut arrondir. Le second, digits=, est facultatif. Il indique la position du chiffre à conserver compté à partir du signe décimal. Une valeur positive indique que la position est située dans la partie décimale (droite) alors qu’une valeur négative indique que la position est dans la partie entière (gauche). Pour arrondir, un nombre décimal, on va • Localiser le chiffre à conserver. • Augmenter ce chiffre d’une unité si le chiffre suivant est strictement supérieur à 5 • Conserver ce chiffre si le chiffre suivant est strictement inférieur à 5 Par exemple, le nombre 3,043 arrondi à 2 chiffres après la virgule vaut 3,04 (le chiffre suivant le 4 (3) est inférieur à 5 ; on conserve donc le chiffre 4). nombre <- c(3.043, 3.046) round(nombre, digits=2) [1] 3.04 3.05 Pour le nombre 3,046, l’arrondi vaut 3,05 (le chiffre suivant le 4 (6), est supérieur à 5 ; on augmente d’une unité). Lorsque le chiffre suivant le chiffre à conserver est le chiffre 5, on procède de la façon suivante : • on augmente ce chiffre d’une unité lorsque le 5 est suivi par des chiffres différents de zéro • lorsque le 5 est suivi de 0 alors on augmente ce chiffre d’une unité si il est impair et on le laisse inchangé dans l’autre cas. Par exemple, 3,0450 arrondi au centièmes vaut 3,04 (le chiffre précédent le 5 est pair) alors que l’arrondi de 3,0750 vaut 3,08 (le chiffre précédent le 5 est impair). nombre <- c(3.0151, 3.0450, 3.0750) round(nombre, digits=2) [1] 3.02 3.04 3.08 On peut aussi fournir un vecteur ou un tableau numérique Par défaut, digits=0 et le nombre est arrondi à l’entier 3 arrondi et truncature Lorsque l’on a un vecteur de nombres, on peut indiquer différents niveaux d’arrondi. round(c(1.234567, 2.465303, 4.876453, 6.87654, 10.02342), digits=c(2,3)) [1] 1.230 2.465 4.880 6.877 10.020 On peut aussi arrondir la partie entière. Pour cela, on va fournir une valeur négative à l’argument digits=. Par exemple, pour arrondir à la centaine, on utilisera digits=-2. nombre <- c(1234.34, 256.2, 651) round(nombre, digits=-2) [1] 1200 300 700 Arrondi au plus grand entier inférieur C’est la fonction ceiling() qui réalise cette opération. Elle fonction possède un seul argument : ceiling(x) La fonction arrondit à l’entier immédiatement supérieur au nombre à arrondir. Pour un nombre positif, cela correspond à la partie entière du nombre augmentée d’une unité. Si le nombre est négatif, c’est la partie entière. Par exemple, l’utilisation de cette fonction sur le nombre 12,45 retourne le nombre 13, alors que pour le nombre -12,45, on aura -12. nombre <- c(12.45, -12.45, 23.67, -23.67, 0.999, -0.999) ceiling(nombre) [1] 13 -12 24 -23 1 0 Arrondi au plus petit entier supérieur Il est obtenu avec la fonction floor(). Cette fonction possède aussi un seul argument : floor(x) Cette fonction ne demande que le nombre à arrondir. L’arrondi est fait à l’entier immédiatement inférieur au nombre à arrondir. Pour un nombre positif, cela correspond à la partie entière du nombre ; pour un nombre négatif, c’est la partie entière augmentée d’une unité. Par exemple, l’utilisation de cette fonction sur le nombre 12,45 retourne le nombre 12, alors que pour le nombre -12,45, on aura -13. nombre <- c(12.45, -12.45, 23.67, -23.67, 0.999, -0.999) floor(nombre) [1] 12 -13 23 -24 0 -1 4 arrondi et truncature Troncature C’est la fonction trunc(). Comme les 2 précédentes, cette fonction n’a qu’un seul argument : trunc(x, ...) Elle retourne la partie entière d’un nombre décimal. trunc(nombre) [1] 12 -12 23 -23 0 0 Son comportement est celui de la fonction floor() pour les nombres positifs et celui de la fonction ceiling() pour les nombres négatifs. identical(trunc(-12.4), ceiling(-12.4) ) [1] TRUE identical(trunc(12.4), floor(12.4) ) [1] TRUE 5