2016-03-31 1 views
1

J'essaie d'utiliser la fonction asinh du module mathématique dans Ironpython 2.7. Chaque fois que j'ai un flotteur < -1, je reçois nan comme résultat. Je sais que dans cmath il y a quelques coupures de branches dues à l'utilisation potentielle de nombres complexes, mais ici je travaille avec des réels et la documentation explique que les maths sont le module approprié.Sinus hyperbolique inverse renvoie nan dans Ironpython2.7

asinh(-.5) 
asinh(-1.) 
asinh(-1.001) 

>>-0.481211 
>>-0.881373 
>>nan 

Ai-je raté quelque chose? Cela fonctionne bien avec toutes les autres versions de Python que j'utilise.

Est-il nécessaire d'écrire une fonction personnalisée en utilisant le log (x + sqrt (x ** 2 + 1) définition? Je me demande vraiment ce qui se passe ici, donc je serais très reconnaissant pour toute réponse approfondie sur ce .

Répondre

1

en regardant dans les sources, je trouve cette mise en œuvre assez lâche:

if (Math.Abs(v0) > 1.0) { 
    return Math.Log(v0) + Math.Log(1.0 + MathUtils.Hypot(1.0, 1.0/v0));} 

C'est pourquoi si v0 < -1, Abs (V0)> 1 mais Math.Log (v0) n'est pas! défini ... J'ai soumis le problème à l'équipe IronPython sur GitHub et j'ai suggéré d'utiliser Math.Sign pour corriger le problème comme ceci:

if (Math.Abs(v0) > 1.0) { 
    return Math.Sign(v0)*(Math.Log(Math.Abs(v0)) + 
       Math.Log(1.0 + MathUtils.Hypot(1.0, 1.0/v0)));}