Обратный гиперболический синус возвращает nan в Ironpython2.7

Я пытаюсь использовать функцию asinh из математического модуля в Ironpython 2.7. Каждый раз, когда у меня есть float <-1, в результате я получаю nan. Я знаю, что в cmath это некоторые сокращения веток из-за потенциального использования комплексных чисел, но здесь я работаю с вещественными числами, и документация объясняет, что математика - подходящий модуль.

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

>>-0.481211
>>-0.881373
>>nan

Я что-то пропустил? Это работает хорошо со всеми другими разновидностями Python, которые я использую.

Нужно ли писать пользовательскую функцию, используя определение log(x+sqrt(x**2+1)? Мне действительно интересно, что здесь происходит, поэтому я был бы очень признателен за любой подробный ответ по этому вопросу.

1 ответ

Решение

Изучая источники, я нашел довольно свободную реализацию:

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

Поэтому! Если v0 <-1, то Abs (v0)> 1, но Math.Log (v0) не определен... Я передал проблему команде IronPython на GitHub и предложил использовать Math.Sign для решения проблемы следующим образом:

 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)));}
Другие вопросы по тегам