Archive du forum du MOOC Recherche Reproductible Session 2

Arrondis des résultats des fonctions max et min?

fun_in_mooc

BOnjour,

Je ne comprends pas pourquoi, dans l’exercice 2 du module 2, les fonctions np.max() et np.min() retournent une valeur erronnée du maximum et du minimum, comme s’il y avait une erreur due au codage des décimaux en float.

J’ai obtenu pour np.max(data) :
23.399999999999999

Alors que dans un script python en local sur ma machine, cela me sort bien comme résultat 23.4

Comment expliquer cette différence de comportement?

Tout ceci sera peut-être plus clair à l’aide de mon notebook:
https://app-learninglab.inria.fr/gitlab/0f1b540e0de7e439c7fbfe0c12833d8d/mooc-rr/blob/master/module2/exo2/exercice.ipynb
MErci!

khinsen

Premièrement, je confirme votre observation. J’obtiens également un affichage différent dans Jupyter par rapport à une console Python standard.

Je n’ai pas d’explication à l’immédiat, ce comportement est assez étonnant. Pourtant, je suis presque sûr qu’il ne s’agit pas d’une erreur d’arrondi mais d’une différence de convention d’affichage.

Le problème de fond est que le nombre 23.4 = 234/10 n’a pas de représentation binaire exacte. Tout comme, par exemple, 1/3 n’a pas de représentation décimale exacte. La valeur stockée dans le tableau data n’est donc pas exactement 23.4, car ce n’est pas possible. Ceci rend l’entrée/sortie des flottants un exercice délicat, dont les conventions ont évolué au cours des années.

Ce que Python applique, c’est la convention la plus courante aujourd’hui. Elle se base sur un algorithme qui produit une représentation décimale d’un flottant binaire qui est garanti d’être unique. Autrement dit, deux flottants différents sont garantis d’avoir des représentations différentes. Ceci permet entre autre d’assurer que la reconversion en flottant binaire mène à exactement la même valeur.

Il paraît que Jupyter n’adhère pas à cette convention, mais je ne peux pas en dire plus pour l’instant.

khinsen

Je viens de faire un autre test avec des versions plus récentes de Python et Jupyter. Le résultat est alors le même. Probablement il s’agit d’un bug qui a été corrigé entre-temps.