Je suis tombé sur quelque chose d'étrange, ici, et je ne sais pas - j'ai le sentiment que cela a quelque chose à voir avec la précision flottante, mais je suis surpris que Python n'affiche pas l'erreur d'approximation.Y a-t-il une précision dans ce nombre que Python ne me montre pas?
Je travaille actuellement sur Project Euler problem 62. Comme un simple test (j'ai depuis résolu en utilisant une approche différente), j'avais un is_cube
que j'avais l'intention de vérifier si un nombre de cubes parfaitement. Donc, pour essayer l'échantillon donné, je l'ai fait:
def is_cube(i):
c = i ** (1./3)
print "c is", c
Quand je courais cela avec i = 41063625, le résultat attendu était la suivante:
c is 345.0
est ici où l'inattendu se produisit:
def is_cube(i):
c = i ** (1./3)
print "c is", int(c)
Tout à coup, j'avais ceci:
c is 344
La valeur c
ne se compare pas à mon littéral 345.0
, soit - c < 345.0
est True.
Y at-il une précision dans ce nombre que Python ne me montre pas? Je me rappelle avoir lu au sujet d'un changement pour rendre les flotteurs semblent plus sains lorsqu'ils sont imprimés; est-ce ceci? Qu'est-ce qui différencie ces deux cas?
>>> def is_cube(i):
... c = i ** (1./3)
... print "c is", c
...
>>> is_cube(41063625)
c is 345.0
>>> 41063625 ** (1./3)
344.99999999999989
Edit: avait encore la fenêtre ouverte et a fait ceci:
>>> print _
345.0
Maintenant, je commence à penser que j'aurais su que print
était à blâmer.
Je ne suis pas sûr d'où vient la confusion. int() prend la partie FRACTIONNELLE du nombre et en résulte en conséquence. Et comme vous l'avez observé, le calcul en virgule flottante de précision relative est juste cela. –
Err, à quel point de moi. Il prend la partie "ENTIER" et rejette entièrement la partie faction. –
@pst: Lisez attentivement. J'ai été trompé par '__str__' en pensant que' c' était '> = 345.0' alors qu'en fait ce n'était pas le cas, il y avait une erreur d'approximation. Par conséquent, je m'attendais à ce que 'int (c)' soit '345', pas' 344'. C'est juste '__str__' qui prend le dessus sur moi à 3:24 du matin, et je ne suis pas tout à fait sûr de savoir où est votre confusion non plus? –