Je construis un tableau avec un élément Cyron par élément. Je souhaite stocker la constante Modifier em> EDIT, vous avoir: p> np.inf code> (ou
-1 * np.inf code>) dans certaines entrées. Cependant, cela nécessitera la surcharge de retourner dans Python pour rechercher
inf code>. Y a-t-il un
libc.math code> équivalent de cette constante? Ou une autre valeur qui pourrait facilement être utilisée équivalente à
(- 1 * np.inf) code> et peut être utilisé à partir de Cyron sans frais générale?
3 Réponses :
Il n'y a pas de littéral pour cela, mais alternativement, (il n'y a pas de nettoyage façon de vérifier si l'infini est définie dans Pure Cyron, donc si vous souhaitez couvrir toutes vos bases, vous devez obtenir un hacky. Une façon de le faire est de créer un petit en-tête C, disons puis dans votre fichier .pyx: p> (Vous ne pouvez pas attribuer à l'infini, parce que c'est une rvalue. Vous pouvez supprimer l'opérateur ternaire si vous #Definkefinhefinez l'infini comme 1,0 / 0,0 dans votre en-tête, mais cela pourrait élever SIGFPE, en fonction de votre compilateur.) p> Ceci est définitivement dans le royaume de l'optimisation du culte de la cargaison, cependant.) p> p> float code> peut analyser à partir d'une chaîne:
math.h code> peut em> (presque certainement) déclarer une macro qui évalue à INF, auquel cas vous pouvez simplement utiliser cela: p>
Fallbackinf.h code>: p>
Mais si j'utilise float code> dans une boucle Cython, cela impliquera-t-il des rappels à Python? J'ai édité ma réponse pour donner un exemple.
En fin de compte, cela appelle pyfloat_asdouble code> à chaque fois, ce qui n'est pas que i> lent, mais pas quelque chose que vous voulez faire plus souvent que nécessaire; Attribuez-le à une constante une fois, en dehors de la boucle. Mais j'ai mis à jour ma réponse avec une méthode différente de la compilation.
Merci! Votre CDEF externe ... code> fonctionne bien. Existe-t-il des systèmes / conditions dans lesquels il pourrait ne pas fonctionner ou devrait-il fonctionner sur une distribution / un système d'exploitation Python?
La macro Infinity a été ajoutée en C99; Si votre Math.h est plus âgé, il n'est pas garanti d'être là (bien que cela soit probablement). En pratique, ça devrait aller bien.
Dernière question: est-il possible de vérifier par programme à l'infini (s'il existe) via Cyron et sinon, par défaut sur float ('Inf') code>?
Pas proprement. J'ai ajouté ce que je crois être le moyen le plus simple de ma réponse.
Vous pouvez utiliser la bibliothèque de mathématiques de Numpy, voir ici pour ce qui est disponible :
>>> from numpy.distutils.misc_util import get_info >>> get_info('npymath') {'define_macros': [], 'libraries': ['npymath', 'm'], 'library_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/lib'], 'include_dirs': ['/usr/lib/python2.7/dist-packages/numpy/core/include']}
La manière recommandée de le faire en Cython est la suivante: note, qu'il s'agit d'une "CIMPORT" plutôt que d'une importation régulière. C'est le wrapper officiel de Cyron autour de Numpy 'Code> Npymath CODE>. P> P>
I Obtenir l'erreur Erreur fatale: fichier 'Numpy / NPY_MATH.H' non trouvé code>. Quelqu'un d'autre obtient ça?
@ hlin117, Nope. Probablement quelque chose qui ne va pas avec votre configuration. Cette réponse est toujours la façon recommandée d'obtenir l'infini.
Pouvez-vous fournir une cité pour "la manière recommandée ..."?
Êtes-vous trop pédantique? Si vous souhaitez utiliser les trucs de NUMPY, alors une manière plus propre que d'utiliser un CDEF externe. Si vous souhaitez utiliser Math.h, alors il ressemble à de libc.math cimport infini code> est maintenant disponible, ce qui pourrait également fonctionner. Ces deux options sont meilleures que les deux autres réponses données, surtout si vous travaillez sur une plate-forme moderne.
Voir également l'exemple d'utilisation cimport code> ici: CYTHON.READTHEDOCS.IO/EN/LATEST/SRC/TURTORIAL/...