2017-10-09 3 views
0

Tenez compte des appels suivants à numpy.nextafterComment comprendre les résultats de numpy.nextafter

>>> from numpy import nextafter 
>>> nextafter(0.1, -1) 
0.099999999999999992 
>>> nextafter(0.1, +1) 
0.10000000000000002 
>>> nextafter(1 , -1) 
0.99999999999999989 
>>> nextafter(1 , +1) 
1.0 
>>> nextafter(10 , -1) 
9.9999999999999982 
>>> nextafter(10 , +1) 
9.9999999999999982 

Je me attends à tous les cas où le second argument est positif, pour retourner une valeur qui est supérieure à la premier argument; et le résultat est plus petit que le premier argument chaque fois que le second argument est inférieur à zéro.

Mes attentes ne sont pas satisfaites par le comportement adopté, en particulier:

  1. nextafter (1, +1) ne change pas la première entrée du tout, au lieu de l'aggraver. Ensuite (10, +1) diminue la première entrée plutôt que de l'augmenter.

Est-ce un bug ou une fonctionnalité?

Ces exemples ont été générés avec Numpy 1.13.1 sur Python 3.6.1

Répondre

2

vous avez mal compris le sens du second paramètre. Selon le docs, la fonction ne (Souligné par l'auteur)

Retour la prochaine valeur à virgule flottante après x1 vers x2, élément par élément.

Ainsi, nextafter(1, +1) ne change rien parce que vous essayez d'aller de 1.0 vers 1.0. nextafter(10, +1) diminue l'entrée parce que c'est comment aller de 10,0 à 1,0.

Vous pouvez aller vers l'infini +/- si vous voulez toujours augmenter/diminuer:

import numpy as np 
nextafter(0.1, -np.inf) # 0.099999999999999992 
nextafter(0.1, +np.inf) # 0.10000000000000002 
nextafter(1 , -np.inf) # 0.99999999999999989 
nextafter(1 , +np.inf) # 1.0000000000000002 
nextafter(10 , -np.inf) # 9.9999999999999982 
nextafter(10 , +np.inf) # 10.000000000000002